adevkit 0.1.0__py3-none-any.whl

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 (731) hide show
  1. adevkit-0.1.0.dist-info/METADATA +171 -0
  2. adevkit-0.1.0.dist-info/RECORD +731 -0
  3. adevkit-0.1.0.dist-info/WHEEL +5 -0
  4. adevkit-0.1.0.dist-info/entry_points.txt +3 -0
  5. adevkit-0.1.0.dist-info/top_level.txt +1 -0
  6. devkit/__init__.py +4 -0
  7. devkit/cli.py +442 -0
  8. devkit/config.py +21 -0
  9. devkit/prompts.py +197 -0
  10. devkit/scaffold/__init__.py +16 -0
  11. devkit/scaffold/agents_md.py +152 -0
  12. devkit/scaffold/env_setup.py +59 -0
  13. devkit/scaffold/git_setup.py +69 -0
  14. devkit/scaffold/prd_md.py +85 -0
  15. devkit/scaffold/vscode_setup.py +38 -0
  16. devkit/skills/__init__.py +10 -0
  17. devkit/skills/catalog.py +156 -0
  18. devkit/skills/embedded/SKILL.md +52 -0
  19. devkit/skills/embedded/animate/RECIPES.md +324 -0
  20. devkit/skills/embedded/animate/SKILL.md +207 -0
  21. devkit/skills/embedded/animate-expo/RECIPES.md +385 -0
  22. devkit/skills/embedded/animate-expo/SKILL.md +263 -0
  23. devkit/skills/embedded/animation-performance/SKILL.md +222 -0
  24. devkit/skills/embedded/animation-vocabulary/SKILL.md +181 -0
  25. devkit/skills/embedded/apple-design/SKILL.md +290 -0
  26. devkit/skills/embedded/ask-sonner/API.md +64 -0
  27. devkit/skills/embedded/ask-sonner/SKILL.md +88 -0
  28. devkit/skills/embedded/banner-design/SKILL.md +145 -0
  29. devkit/skills/embedded/banner-design/references/banner-sizes-and-styles.md +118 -0
  30. devkit/skills/embedded/brand/SKILL.md +108 -0
  31. devkit/skills/embedded/brand/references/approval-checklist.md +169 -0
  32. devkit/skills/embedded/brand/references/asset-organization.md +157 -0
  33. devkit/skills/embedded/brand/references/brand-guideline-template.md +140 -0
  34. devkit/skills/embedded/brand/references/color-palette-management.md +186 -0
  35. devkit/skills/embedded/brand/references/consistency-checklist.md +94 -0
  36. devkit/skills/embedded/brand/references/logo-usage-rules.md +185 -0
  37. devkit/skills/embedded/brand/references/messaging-framework.md +85 -0
  38. devkit/skills/embedded/brand/references/typography-specifications.md +214 -0
  39. devkit/skills/embedded/brand/references/update.md +129 -0
  40. devkit/skills/embedded/brand/references/visual-identity.md +96 -0
  41. devkit/skills/embedded/brand/references/voice-framework.md +88 -0
  42. devkit/skills/embedded/brand/scripts/extract-colors.cjs +337 -0
  43. devkit/skills/embedded/brand/scripts/inject-brand-context.cjs +349 -0
  44. devkit/skills/embedded/brand/scripts/sync-brand-to-tokens.cjs +415 -0
  45. devkit/skills/embedded/brand/scripts/tests/test_sync_brand_to_tokens.py +368 -0
  46. devkit/skills/embedded/brand/scripts/validate-asset.cjs +387 -0
  47. devkit/skills/embedded/brand/templates/brand-guidelines-starter.md +275 -0
  48. devkit/skills/embedded/break-ui/CATALOG.md +135 -0
  49. devkit/skills/embedded/break-ui/SKILL.md +175 -0
  50. devkit/skills/embedded/chrome-devtools/SKILL.md +74 -0
  51. devkit/skills/embedded/deploy-to-vercel/Archive.zip +0 -0
  52. devkit/skills/embedded/deploy-to-vercel/SKILL.md +296 -0
  53. devkit/skills/embedded/deploy-to-vercel/resources/deploy-codex.sh +301 -0
  54. devkit/skills/embedded/deploy-to-vercel/resources/deploy.sh +301 -0
  55. devkit/skills/embedded/design/SKILL.md +333 -0
  56. devkit/skills/embedded/design/data/cip/deliverables.csv +51 -0
  57. devkit/skills/embedded/design/data/cip/industries.csv +21 -0
  58. devkit/skills/embedded/design/data/cip/mockup-contexts.csv +21 -0
  59. devkit/skills/embedded/design/data/cip/styles.csv +21 -0
  60. devkit/skills/embedded/design/data/icon/styles.csv +16 -0
  61. devkit/skills/embedded/design/data/logo/colors.csv +56 -0
  62. devkit/skills/embedded/design/data/logo/industries.csv +56 -0
  63. devkit/skills/embedded/design/data/logo/styles.csv +56 -0
  64. devkit/skills/embedded/design/references/banner-sizes-and-styles.md +118 -0
  65. devkit/skills/embedded/design/references/cip-deliverable-guide.md +95 -0
  66. devkit/skills/embedded/design/references/cip-design.md +123 -0
  67. devkit/skills/embedded/design/references/cip-prompt-engineering.md +84 -0
  68. devkit/skills/embedded/design/references/cip-style-guide.md +68 -0
  69. devkit/skills/embedded/design/references/design-routing.md +207 -0
  70. devkit/skills/embedded/design/references/icon-design.md +122 -0
  71. devkit/skills/embedded/design/references/logo-color-psychology.md +101 -0
  72. devkit/skills/embedded/design/references/logo-design.md +110 -0
  73. devkit/skills/embedded/design/references/logo-prompt-engineering.md +158 -0
  74. devkit/skills/embedded/design/references/logo-style-guide.md +109 -0
  75. devkit/skills/embedded/design/references/slides-copywriting-formulas.md +84 -0
  76. devkit/skills/embedded/design/references/slides-create.md +4 -0
  77. devkit/skills/embedded/design/references/slides-html-template.md +295 -0
  78. devkit/skills/embedded/design/references/slides-layout-patterns.md +137 -0
  79. devkit/skills/embedded/design/references/slides-strategies.md +94 -0
  80. devkit/skills/embedded/design/references/slides.md +42 -0
  81. devkit/skills/embedded/design/references/social-photos-design.md +329 -0
  82. devkit/skills/embedded/design/scripts/cip/core.py +215 -0
  83. devkit/skills/embedded/design/scripts/cip/generate.py +504 -0
  84. devkit/skills/embedded/design/scripts/cip/render-html.py +424 -0
  85. devkit/skills/embedded/design/scripts/cip/search.py +127 -0
  86. devkit/skills/embedded/design/scripts/icon/generate.py +535 -0
  87. devkit/skills/embedded/design/scripts/logo/core.py +175 -0
  88. devkit/skills/embedded/design/scripts/logo/generate.py +812 -0
  89. devkit/skills/embedded/design/scripts/logo/search.py +114 -0
  90. devkit/skills/embedded/design/scripts/logo/tests/test_generate.py +454 -0
  91. devkit/skills/embedded/design/scripts/tests/test_cip_generate.py +134 -0
  92. devkit/skills/embedded/design/scripts/tests/test_icon_generate.py +178 -0
  93. devkit/skills/embedded/design-system/SKILL.md +248 -0
  94. devkit/skills/embedded/design-system/data/slide-backgrounds.csv +11 -0
  95. devkit/skills/embedded/design-system/data/slide-charts.csv +26 -0
  96. devkit/skills/embedded/design-system/data/slide-color-logic.csv +14 -0
  97. devkit/skills/embedded/design-system/data/slide-copy.csv +26 -0
  98. devkit/skills/embedded/design-system/data/slide-layout-logic.csv +16 -0
  99. devkit/skills/embedded/design-system/data/slide-layouts.csv +26 -0
  100. devkit/skills/embedded/design-system/data/slide-strategies.csv +16 -0
  101. devkit/skills/embedded/design-system/data/slide-typography.csv +15 -0
  102. devkit/skills/embedded/design-system/references/component-specs.md +236 -0
  103. devkit/skills/embedded/design-system/references/component-tokens.md +214 -0
  104. devkit/skills/embedded/design-system/references/primitive-tokens.md +203 -0
  105. devkit/skills/embedded/design-system/references/semantic-tokens.md +215 -0
  106. devkit/skills/embedded/design-system/references/states-and-variants.md +241 -0
  107. devkit/skills/embedded/design-system/references/tailwind-integration.md +251 -0
  108. devkit/skills/embedded/design-system/references/token-architecture.md +224 -0
  109. devkit/skills/embedded/design-system/scripts/embed-tokens.cjs +103 -0
  110. devkit/skills/embedded/design-system/scripts/fetch-background.py +339 -0
  111. devkit/skills/embedded/design-system/scripts/generate-slide.py +770 -0
  112. devkit/skills/embedded/design-system/scripts/generate-tokens.cjs +205 -0
  113. devkit/skills/embedded/design-system/scripts/html-token-validator.py +359 -0
  114. devkit/skills/embedded/design-system/scripts/search-slides.py +228 -0
  115. devkit/skills/embedded/design-system/scripts/slide-token-validator.py +35 -0
  116. devkit/skills/embedded/design-system/scripts/slide_search_core.py +453 -0
  117. devkit/skills/embedded/design-system/scripts/tests/test_validate_tokens.py +52 -0
  118. devkit/skills/embedded/design-system/scripts/validate-tokens.cjs +246 -0
  119. devkit/skills/embedded/design-system/templates/design-tokens-starter.json +143 -0
  120. devkit/skills/embedded/design-taste-frontend/README.md +81 -0
  121. devkit/skills/embedded/design-taste-frontend/SKILL.md +542 -0
  122. devkit/skills/embedded/design-taste-frontend/assets/app.css +216 -0
  123. devkit/skills/embedded/design-taste-frontend/assets/base.css +105 -0
  124. devkit/skills/embedded/design-taste-frontend/assets/base.js +37 -0
  125. devkit/skills/embedded/design-taste-frontend/assets/charts.js +619 -0
  126. devkit/skills/embedded/design-taste-frontend/assets/scenes/stage.css +28 -0
  127. devkit/skills/embedded/design-taste-frontend/assets/scenes/stage.js +134 -0
  128. devkit/skills/embedded/design-taste-frontend/evals/evals.json +76 -0
  129. devkit/skills/embedded/design-taste-frontend/library/app.json +1327 -0
  130. devkit/skills/embedded/design-taste-frontend/library/directions.json +1078 -0
  131. devkit/skills/embedded/design-taste-frontend/library/heroes.json +1086 -0
  132. devkit/skills/embedded/design-taste-frontend/library/motions.json +92 -0
  133. devkit/skills/embedded/design-taste-frontend/library/palettes.json +1485 -0
  134. devkit/skills/embedded/design-taste-frontend/library/photos.json +7240 -0
  135. devkit/skills/embedded/design-taste-frontend/library/sections.json +4429 -0
  136. devkit/skills/embedded/design-taste-frontend/library/sites.json +8350 -0
  137. devkit/skills/embedded/design-taste-frontend/library/type.json +2024 -0
  138. devkit/skills/embedded/design-taste-frontend/references/app-screens.md +1199 -0
  139. devkit/skills/embedded/design-taste-frontend/references/colour.md +141 -0
  140. devkit/skills/embedded/design-taste-frontend/references/copy.md +177 -0
  141. devkit/skills/embedded/design-taste-frontend/references/critique.md +182 -0
  142. devkit/skills/embedded/design-taste-frontend/references/imagery.md +791 -0
  143. devkit/skills/embedded/design-taste-frontend/references/layout.md +292 -0
  144. devkit/skills/embedded/design-taste-frontend/references/motion.md +980 -0
  145. devkit/skills/embedded/design-taste-frontend/references/research.md +356 -0
  146. devkit/skills/embedded/design-taste-frontend/references/scenes.md +174 -0
  147. devkit/skills/embedded/design-taste-frontend/references/tells.md +115 -0
  148. devkit/skills/embedded/design-taste-frontend/references/type.md +170 -0
  149. devkit/skills/embedded/design-taste-frontend/scripts/assets.mjs +865 -0
  150. devkit/skills/embedded/design-taste-frontend/scripts/draw.mjs +584 -0
  151. devkit/skills/embedded/design-taste-frontend/scripts/inspect.mjs +308 -0
  152. devkit/skills/embedded/design-taste-frontend/scripts/lib/app-draw.mjs +203 -0
  153. devkit/skills/embedded/design-taste-frontend/scripts/lib/cdp.mjs +248 -0
  154. devkit/skills/embedded/design-taste-frontend/scripts/lib/inspection-files.mjs +9 -0
  155. devkit/skills/embedded/design-taste-frontend/scripts/lib/probe.mjs +929 -0
  156. devkit/skills/embedded/design-taste-frontend/scripts/lib/rules.mjs +243 -0
  157. devkit/skills/embedded/design-taste-frontend/scripts/lint.mjs +119 -0
  158. devkit/skills/embedded/design-taste-frontend/scripts/scenes.mjs +124 -0
  159. devkit/skills/embedded/emil-design-eng/SKILL.md +674 -0
  160. devkit/skills/embedded/find-animation-opportunities/SKILL.md +140 -0
  161. devkit/skills/embedded/gemini-api-dev/SKILL.md +458 -0
  162. devkit/skills/embedded/gemini-api-dev/references/migration.md +180 -0
  163. devkit/skills/embedded/impeccable/SKILL.md +86 -0
  164. devkit/skills/embedded/impeccable/agents/impeccable_asset_producer.toml +47 -0
  165. devkit/skills/embedded/impeccable/agents/impeccable_documenter.toml +27 -0
  166. devkit/skills/embedded/impeccable/agents/impeccable_finish_reviewer.toml +41 -0
  167. devkit/skills/embedded/impeccable/agents/impeccable_manual_edit_applier.toml +95 -0
  168. devkit/skills/embedded/impeccable/agents/openai.yaml +4 -0
  169. devkit/skills/embedded/impeccable/reference/adapt.md +318 -0
  170. devkit/skills/embedded/impeccable/reference/adapt.native.md +58 -0
  171. devkit/skills/embedded/impeccable/reference/android.md +46 -0
  172. devkit/skills/embedded/impeccable/reference/animate.md +89 -0
  173. devkit/skills/embedded/impeccable/reference/audit.md +139 -0
  174. devkit/skills/embedded/impeccable/reference/audit.native.md +139 -0
  175. devkit/skills/embedded/impeccable/reference/bolder.md +33 -0
  176. devkit/skills/embedded/impeccable/reference/clarify.md +94 -0
  177. devkit/skills/embedded/impeccable/reference/colorize.md +86 -0
  178. devkit/skills/embedded/impeccable/reference/component-review.md +63 -0
  179. devkit/skills/embedded/impeccable/reference/craft-floor.md +50 -0
  180. devkit/skills/embedded/impeccable/reference/craft.md +5 -0
  181. devkit/skills/embedded/impeccable/reference/critique.md +841 -0
  182. devkit/skills/embedded/impeccable/reference/degraded/asset-producer.md +44 -0
  183. devkit/skills/embedded/impeccable/reference/degraded/documenter.md +24 -0
  184. devkit/skills/embedded/impeccable/reference/degraded/finish-reviewer.md +38 -0
  185. devkit/skills/embedded/impeccable/reference/degraded/manual-edit-applier.md +92 -0
  186. devkit/skills/embedded/impeccable/reference/delight.md +70 -0
  187. devkit/skills/embedded/impeccable/reference/distill.md +111 -0
  188. devkit/skills/embedded/impeccable/reference/doctor.md +54 -0
  189. devkit/skills/embedded/impeccable/reference/document.md +416 -0
  190. devkit/skills/embedded/impeccable/reference/extract.md +69 -0
  191. devkit/skills/embedded/impeccable/reference/generate.md +101 -0
  192. devkit/skills/embedded/impeccable/reference/harden.md +362 -0
  193. devkit/skills/embedded/impeccable/reference/hooks.md +113 -0
  194. devkit/skills/embedded/impeccable/reference/init.md +131 -0
  195. devkit/skills/embedded/impeccable/reference/ios.md +51 -0
  196. devkit/skills/embedded/impeccable/reference/layout.md +84 -0
  197. devkit/skills/embedded/impeccable/reference/live-setup.md +104 -0
  198. devkit/skills/embedded/impeccable/reference/live.md +327 -0
  199. devkit/skills/embedded/impeccable/reference/mode-operate.md +21 -0
  200. devkit/skills/embedded/impeccable/reference/mode-persuade.md +19 -0
  201. devkit/skills/embedded/impeccable/reference/mode-read.md +21 -0
  202. devkit/skills/embedded/impeccable/reference/new-work.md +152 -0
  203. devkit/skills/embedded/impeccable/reference/onboard.md +234 -0
  204. devkit/skills/embedded/impeccable/reference/operate.md +61 -0
  205. devkit/skills/embedded/impeccable/reference/optimize.md +257 -0
  206. devkit/skills/embedded/impeccable/reference/overdrive.md +127 -0
  207. devkit/skills/embedded/impeccable/reference/polish.md +105 -0
  208. devkit/skills/embedded/impeccable/reference/quieter.md +99 -0
  209. devkit/skills/embedded/impeccable/reference/region-map.md +26 -0
  210. devkit/skills/embedded/impeccable/reference/routing.md +24 -0
  211. devkit/skills/embedded/impeccable/reference/shape.md +59 -0
  212. devkit/skills/embedded/impeccable/reference/typeset.md +90 -0
  213. devkit/skills/embedded/impeccable/reference/visualize.md +47 -0
  214. devkit/skills/embedded/impeccable/scripts/VERSION +1 -0
  215. devkit/skills/embedded/impeccable/scripts/command-metadata.json +98 -0
  216. devkit/skills/embedded/impeccable/scripts/data/font-index-failures.json +121 -0
  217. devkit/skills/embedded/impeccable/scripts/data/font-index.json +1 -0
  218. devkit/skills/embedded/impeccable/scripts/impeccable +213 -0
  219. devkit/skills/embedded/impeccable/scripts/impeccable.cmd +239 -0
  220. devkit/skills/embedded/impeccable/scripts/live-browser-dom.js +320 -0
  221. devkit/skills/embedded/impeccable/scripts/live-browser-ignores.js +246 -0
  222. devkit/skills/embedded/impeccable/scripts/live-browser-session.js +183 -0
  223. devkit/skills/embedded/impeccable/scripts/live-browser.js +13645 -0
  224. devkit/skills/embedded/impeccable/scripts/modern-screenshot.umd.js +14 -0
  225. devkit/skills/embedded/improve-animations/AUDIT.md +115 -0
  226. devkit/skills/embedded/improve-animations/PLAN-TEMPLATE.md +73 -0
  227. devkit/skills/embedded/improve-animations/SKILL.md +109 -0
  228. devkit/skills/embedded/mobile-native/SKILL.md +311 -0
  229. devkit/skills/embedded/modern-web-guidance/SKILL.md +135 -0
  230. devkit/skills/embedded/pick-ui-library/SKILL.md +85 -0
  231. devkit/skills/embedded/ponytail/SKILL.md +52 -0
  232. devkit/skills/embedded/ponytail-audit/SKILL.md +103 -0
  233. devkit/skills/embedded/ponytail-debt/SKILL.md +44 -0
  234. devkit/skills/embedded/ponytail-gain/SKILL.md +52 -0
  235. devkit/skills/embedded/ponytail-help/SKILL.md +76 -0
  236. devkit/skills/embedded/ponytail-review/SKILL.md +101 -0
  237. devkit/skills/embedded/prototype/PICKER.md +197 -0
  238. devkit/skills/embedded/prototype/SKILL.md +98 -0
  239. devkit/skills/embedded/review-animations/SKILL.md +120 -0
  240. devkit/skills/embedded/review-animations/STANDARDS.md +187 -0
  241. devkit/skills/embedded/skills-lock.json +239 -0
  242. devkit/skills/embedded/slides/SKILL.md +44 -0
  243. devkit/skills/embedded/slides/references/copywriting-formulas.md +84 -0
  244. devkit/skills/embedded/slides/references/create.md +4 -0
  245. devkit/skills/embedded/slides/references/html-template.md +295 -0
  246. devkit/skills/embedded/slides/references/layout-patterns.md +137 -0
  247. devkit/skills/embedded/slides/references/slide-strategies.md +94 -0
  248. devkit/skills/embedded/ui-styling/LICENSE.txt +202 -0
  249. devkit/skills/embedded/ui-styling/SKILL.md +336 -0
  250. devkit/skills/embedded/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  251. devkit/skills/embedded/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  252. devkit/skills/embedded/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  253. devkit/skills/embedded/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
  254. devkit/skills/embedded/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  255. devkit/skills/embedded/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
  256. devkit/skills/embedded/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
  257. devkit/skills/embedded/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  258. devkit/skills/embedded/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  259. devkit/skills/embedded/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  260. devkit/skills/embedded/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  261. devkit/skills/embedded/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  262. devkit/skills/embedded/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  263. devkit/skills/embedded/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  264. devkit/skills/embedded/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
  265. devkit/skills/embedded/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
  266. devkit/skills/embedded/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
  267. devkit/skills/embedded/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
  268. devkit/skills/embedded/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
  269. devkit/skills/embedded/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
  270. devkit/skills/embedded/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
  271. devkit/skills/embedded/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
  272. devkit/skills/embedded/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
  273. devkit/skills/embedded/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  274. devkit/skills/embedded/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  275. devkit/skills/embedded/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  276. devkit/skills/embedded/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  277. devkit/skills/embedded/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  278. devkit/skills/embedded/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  279. devkit/skills/embedded/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  280. devkit/skills/embedded/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  281. devkit/skills/embedded/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  282. devkit/skills/embedded/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  283. devkit/skills/embedded/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  284. devkit/skills/embedded/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  285. devkit/skills/embedded/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  286. devkit/skills/embedded/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  287. devkit/skills/embedded/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
  288. devkit/skills/embedded/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
  289. devkit/skills/embedded/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  290. devkit/skills/embedded/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  291. devkit/skills/embedded/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  292. devkit/skills/embedded/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
  293. devkit/skills/embedded/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
  294. devkit/skills/embedded/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
  295. devkit/skills/embedded/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  296. devkit/skills/embedded/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  297. devkit/skills/embedded/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
  298. devkit/skills/embedded/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  299. devkit/skills/embedded/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
  300. devkit/skills/embedded/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
  301. devkit/skills/embedded/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
  302. devkit/skills/embedded/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
  303. devkit/skills/embedded/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
  304. devkit/skills/embedded/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
  305. devkit/skills/embedded/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  306. devkit/skills/embedded/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  307. devkit/skills/embedded/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
  308. devkit/skills/embedded/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
  309. devkit/skills/embedded/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
  310. devkit/skills/embedded/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  311. devkit/skills/embedded/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
  312. devkit/skills/embedded/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
  313. devkit/skills/embedded/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  314. devkit/skills/embedded/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  315. devkit/skills/embedded/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
  316. devkit/skills/embedded/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  317. devkit/skills/embedded/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
  318. devkit/skills/embedded/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  319. devkit/skills/embedded/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  320. devkit/skills/embedded/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
  321. devkit/skills/embedded/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
  322. devkit/skills/embedded/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
  323. devkit/skills/embedded/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
  324. devkit/skills/embedded/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
  325. devkit/skills/embedded/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  326. devkit/skills/embedded/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
  327. devkit/skills/embedded/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
  328. devkit/skills/embedded/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
  329. devkit/skills/embedded/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
  330. devkit/skills/embedded/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  331. devkit/skills/embedded/ui-styling/references/canvas-design-system.md +320 -0
  332. devkit/skills/embedded/ui-styling/references/shadcn-accessibility.md +471 -0
  333. devkit/skills/embedded/ui-styling/references/shadcn-components.md +424 -0
  334. devkit/skills/embedded/ui-styling/references/shadcn-theming.md +373 -0
  335. devkit/skills/embedded/ui-styling/references/tailwind-customization.md +483 -0
  336. devkit/skills/embedded/ui-styling/references/tailwind-responsive.md +382 -0
  337. devkit/skills/embedded/ui-styling/references/tailwind-utilities.md +455 -0
  338. devkit/skills/embedded/ui-styling/scripts/.coverage +0 -0
  339. devkit/skills/embedded/ui-styling/scripts/requirements.txt +17 -0
  340. devkit/skills/embedded/ui-styling/scripts/shadcn_add.py +308 -0
  341. devkit/skills/embedded/ui-styling/scripts/tailwind_config_gen.py +508 -0
  342. devkit/skills/embedded/ui-styling/scripts/tests/coverage-ui.json +1 -0
  343. devkit/skills/embedded/ui-styling/scripts/tests/requirements.txt +3 -0
  344. devkit/skills/embedded/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
  345. devkit/skills/embedded/ui-styling/scripts/tests/test_tailwind_config_gen.py +508 -0
  346. devkit/skills/embedded/ui-ux-pro-max/SKILL.md +214 -0
  347. devkit/skills/embedded/ui-ux-pro-max/data/app-interface.csv +33 -0
  348. devkit/skills/embedded/ui-ux-pro-max/data/catalog-summary.json +78 -0
  349. devkit/skills/embedded/ui-ux-pro-max/data/charts.csv +26 -0
  350. devkit/skills/embedded/ui-ux-pro-max/data/colors.csv +193 -0
  351. devkit/skills/embedded/ui-ux-pro-max/data/data-provenance.json +1348 -0
  352. devkit/skills/embedded/ui-ux-pro-max/data/google-font-licenses.json +20185 -0
  353. devkit/skills/embedded/ui-ux-pro-max/data/google-fonts.csv +1935 -0
  354. devkit/skills/embedded/ui-ux-pro-max/data/icons.csv +106 -0
  355. devkit/skills/embedded/ui-ux-pro-max/data/landing.csv +35 -0
  356. devkit/skills/embedded/ui-ux-pro-max/data/motion.csv +18 -0
  357. devkit/skills/embedded/ui-ux-pro-max/data/phosphor-icons-upstream.json +32582 -0
  358. devkit/skills/embedded/ui-ux-pro-max/data/products.csv +193 -0
  359. devkit/skills/embedded/ui-ux-pro-max/data/react-performance.csv +45 -0
  360. devkit/skills/embedded/ui-ux-pro-max/data/stacks/angular.csv +51 -0
  361. devkit/skills/embedded/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  362. devkit/skills/embedded/ui-ux-pro-max/data/stacks/avalonia.csv +57 -0
  363. devkit/skills/embedded/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  364. devkit/skills/embedded/ui-ux-pro-max/data/stacks/html-tailwind.csv +60 -0
  365. devkit/skills/embedded/ui-ux-pro-max/data/stacks/javafx.csv +76 -0
  366. devkit/skills/embedded/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  367. devkit/skills/embedded/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
  368. devkit/skills/embedded/ui-ux-pro-max/data/stacks/nextjs.csv +62 -0
  369. devkit/skills/embedded/ui-ux-pro-max/data/stacks/nuxt-ui.csv +77 -0
  370. devkit/skills/embedded/ui-ux-pro-max/data/stacks/nuxtjs.csv +68 -0
  371. devkit/skills/embedded/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  372. devkit/skills/embedded/ui-ux-pro-max/data/stacks/react.csv +67 -0
  373. devkit/skills/embedded/ui-ux-pro-max/data/stacks/shadcn.csv +69 -0
  374. devkit/skills/embedded/ui-ux-pro-max/data/stacks/svelte.csv +56 -0
  375. devkit/skills/embedded/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  376. devkit/skills/embedded/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
  377. devkit/skills/embedded/ui-ux-pro-max/data/stacks/uno.csv +60 -0
  378. devkit/skills/embedded/ui-ux-pro-max/data/stacks/uwp.csv +56 -0
  379. devkit/skills/embedded/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  380. devkit/skills/embedded/ui-ux-pro-max/data/stacks/winui.csv +60 -0
  381. devkit/skills/embedded/ui-ux-pro-max/data/stacks/wpf.csv +57 -0
  382. devkit/skills/embedded/ui-ux-pro-max/data/styles.csv +89 -0
  383. devkit/skills/embedded/ui-ux-pro-max/data/typography.csv +75 -0
  384. devkit/skills/embedded/ui-ux-pro-max/data/ui-reasoning.csv +193 -0
  385. devkit/skills/embedded/ui-ux-pro-max/data/ux-guidelines.csv +120 -0
  386. devkit/skills/embedded/ui-ux-pro-max/references/pro-rules.md +117 -0
  387. devkit/skills/embedded/ui-ux-pro-max/references/quick-reference.md +256 -0
  388. devkit/skills/embedded/ui-ux-pro-max/scripts/core.py +993 -0
  389. devkit/skills/embedded/ui-ux-pro-max/scripts/design_system.py +1668 -0
  390. devkit/skills/embedded/ui-ux-pro-max/scripts/reasoning_contract.py +123 -0
  391. devkit/skills/embedded/ui-ux-pro-max/scripts/search.py +177 -0
  392. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-api.json +36 -0
  393. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-catalog.json +33 -0
  394. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-existing.csv +3 -0
  395. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-metadata.json +17 -0
  396. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-overrides.json +7 -0
  397. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/icons-curated.csv +4 -0
  398. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-core.json +23 -0
  399. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-package.json +13 -0
  400. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-react-exports.json +4 -0
  401. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-react-package.json +5 -0
  402. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/relevance-baseline.json +3366 -0
  403. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/relevance-cases.json +111 -0
  404. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/fixtures/relevance-thresholds.json +100 -0
  405. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_catalog_refresh.py +354 -0
  406. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_catalog_summary_line_endings.py +78 -0
  407. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_core.py +343 -0
  408. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_core_data_quality.py +198 -0
  409. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_data_contracts.py +421 -0
  410. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +233 -0
  411. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_design_system_stack.py +61 -0
  412. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_native_desktop_stack_freshness.py +179 -0
  413. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_relevance_evaluator.py +182 -0
  414. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_skill_script_paths.py +82 -0
  415. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_style_taxonomy.py +175 -0
  416. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_text_layout_resilience.py +120 -0
  417. devkit/skills/embedded/ui-ux-pro-max/scripts/tests/test_web_stack_freshness.py +177 -0
  418. devkit/skills/embedded/ui-ux-pro-max/scripts/validate_data.py +1095 -0
  419. devkit/skills/embedded/vercel-cli-with-tokens/SKILL.md +353 -0
  420. devkit/skills/embedded/vercel-composition-patterns/AGENTS.md +946 -0
  421. devkit/skills/embedded/vercel-composition-patterns/README.md +60 -0
  422. devkit/skills/embedded/vercel-composition-patterns/SKILL.md +89 -0
  423. devkit/skills/embedded/vercel-composition-patterns/rules/_sections.md +29 -0
  424. devkit/skills/embedded/vercel-composition-patterns/rules/_template.md +24 -0
  425. devkit/skills/embedded/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  426. devkit/skills/embedded/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  427. devkit/skills/embedded/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  428. devkit/skills/embedded/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  429. devkit/skills/embedded/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  430. devkit/skills/embedded/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  431. devkit/skills/embedded/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  432. devkit/skills/embedded/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  433. devkit/skills/embedded/vercel-optimize/AGENTS.md +48 -0
  434. devkit/skills/embedded/vercel-optimize/CONTRIBUTING.md +41 -0
  435. devkit/skills/embedded/vercel-optimize/README.md +91 -0
  436. devkit/skills/embedded/vercel-optimize/SKILL.md +322 -0
  437. devkit/skills/embedded/vercel-optimize/lib/auth-route.mjs +23 -0
  438. devkit/skills/embedded/vercel-optimize/lib/budget-summary.mjs +182 -0
  439. devkit/skills/embedded/vercel-optimize/lib/citations.mjs +139 -0
  440. devkit/skills/embedded/vercel-optimize/lib/cost-coverage.mjs +143 -0
  441. devkit/skills/embedded/vercel-optimize/lib/dedup-recs.mjs +325 -0
  442. devkit/skills/embedded/vercel-optimize/lib/deep-dive.mjs +350 -0
  443. devkit/skills/embedded/vercel-optimize/lib/display-labels.mjs +185 -0
  444. devkit/skills/embedded/vercel-optimize/lib/extract-claims.mjs +550 -0
  445. devkit/skills/embedded/vercel-optimize/lib/framework-support.mjs +67 -0
  446. devkit/skills/embedded/vercel-optimize/lib/gates/build-minutes-fanout.mjs +69 -0
  447. devkit/skills/embedded/vercel-optimize/lib/gates/cold-start.mjs +66 -0
  448. devkit/skills/embedded/vercel-optimize/lib/gates/contract.mjs +79 -0
  449. devkit/skills/embedded/vercel-optimize/lib/gates/cwv-poor.mjs +87 -0
  450. devkit/skills/embedded/vercel-optimize/lib/gates/external-api-slow.mjs +55 -0
  451. devkit/skills/embedded/vercel-optimize/lib/gates/hard-gates.mjs +73 -0
  452. devkit/skills/embedded/vercel-optimize/lib/gates/index.mjs +45 -0
  453. devkit/skills/embedded/vercel-optimize/lib/gates/isr-overrevalidation.mjs +62 -0
  454. devkit/skills/embedded/vercel-optimize/lib/gates/middleware-heavy.mjs +51 -0
  455. devkit/skills/embedded/vercel-optimize/lib/gates/observability-events-attribution.mjs +56 -0
  456. devkit/skills/embedded/vercel-optimize/lib/gates/platform-bot-protection.mjs +115 -0
  457. devkit/skills/embedded/vercel-optimize/lib/gates/platform-fluid-compute.mjs +83 -0
  458. devkit/skills/embedded/vercel-optimize/lib/gates/region-misconfig.mjs +64 -0
  459. devkit/skills/embedded/vercel-optimize/lib/gates/route-errors.mjs +80 -0
  460. devkit/skills/embedded/vercel-optimize/lib/gates/scanner-driven.mjs +122 -0
  461. devkit/skills/embedded/vercel-optimize/lib/gates/select-candidates.mjs +134 -0
  462. devkit/skills/embedded/vercel-optimize/lib/gates/slow-route.mjs +88 -0
  463. devkit/skills/embedded/vercel-optimize/lib/gates/types.d.ts +38 -0
  464. devkit/skills/embedded/vercel-optimize/lib/gates/uncached-route.mjs +93 -0
  465. devkit/skills/embedded/vercel-optimize/lib/gates/usage-spike-triage.mjs +121 -0
  466. devkit/skills/embedded/vercel-optimize/lib/grade-recommendation.mjs +155 -0
  467. devkit/skills/embedded/vercel-optimize/lib/impact-label.mjs +126 -0
  468. devkit/skills/embedded/vercel-optimize/lib/impact-magnitude.mjs +60 -0
  469. devkit/skills/embedded/vercel-optimize/lib/investigation-brief.mjs +610 -0
  470. devkit/skills/embedded/vercel-optimize/lib/observation-safety.mjs +174 -0
  471. devkit/skills/embedded/vercel-optimize/lib/project-facts.mjs +99 -0
  472. devkit/skills/embedded/vercel-optimize/lib/queries.mjs +315 -0
  473. devkit/skills/embedded/vercel-optimize/lib/reconcile-candidates.mjs +372 -0
  474. devkit/skills/embedded/vercel-optimize/lib/render-report.mjs +955 -0
  475. devkit/skills/embedded/vercel-optimize/lib/repo-root.mjs +86 -0
  476. devkit/skills/embedded/vercel-optimize/lib/route-normalize.mjs +220 -0
  477. devkit/skills/embedded/vercel-optimize/lib/sanitizers/bot-protection-certainty.mjs +38 -0
  478. devkit/skills/embedded/vercel-optimize/lib/sanitizers/cache-tag-invalidation-certainty.mjs +30 -0
  479. devkit/skills/embedded/vercel-optimize/lib/sanitizers/count-correct.mjs +52 -0
  480. devkit/skills/embedded/vercel-optimize/lib/sanitizers/function-duration-invocations.mjs +38 -0
  481. devkit/skills/embedded/vercel-optimize/lib/sanitizers/index.mjs +79 -0
  482. devkit/skills/embedded/vercel-optimize/lib/sanitizers/middleware-conflict.mjs +36 -0
  483. devkit/skills/embedded/vercel-optimize/lib/sanitizers/missing-citation.mjs +16 -0
  484. devkit/skills/embedded/vercel-optimize/lib/sanitizers/pre-release.mjs +74 -0
  485. devkit/skills/embedded/vercel-optimize/lib/sanitizers/rate-limit.mjs +67 -0
  486. devkit/skills/embedded/vercel-optimize/lib/sanitizers/rendering-mode-mislabel.mjs +38 -0
  487. devkit/skills/embedded/vercel-optimize/lib/sanitizers/undeclared-dep.mjs +78 -0
  488. devkit/skills/embedded/vercel-optimize/lib/sanitizers/vercel-directive-strip.mjs +37 -0
  489. devkit/skills/embedded/vercel-optimize/lib/sanitizers/window-units.mjs +32 -0
  490. devkit/skills/embedded/vercel-optimize/lib/scanners/cache-components-suspense-dedupe.mjs +109 -0
  491. devkit/skills/embedded/vercel-optimize/lib/scanners/edge-heavy-import.mjs +94 -0
  492. devkit/skills/embedded/vercel-optimize/lib/scanners/force-dynamic.mjs +42 -0
  493. devkit/skills/embedded/vercel-optimize/lib/scanners/headers-in-page.mjs +44 -0
  494. devkit/skills/embedded/vercel-optimize/lib/scanners/index.mjs +35 -0
  495. devkit/skills/embedded/vercel-optimize/lib/scanners/large-static-asset.mjs +92 -0
  496. devkit/skills/embedded/vercel-optimize/lib/scanners/max-age-without-s-maxage.mjs +42 -0
  497. devkit/skills/embedded/vercel-optimize/lib/scanners/middleware-broad-matcher.mjs +55 -0
  498. devkit/skills/embedded/vercel-optimize/lib/scanners/missing-cache-headers.mjs +90 -0
  499. devkit/skills/embedded/vercel-optimize/lib/scanners/prisma-include-tree.mjs +42 -0
  500. devkit/skills/embedded/vercel-optimize/lib/scanners/region-pin-in-config.mjs +88 -0
  501. devkit/skills/embedded/vercel-optimize/lib/scanners/source-maps-production.mjs +36 -0
  502. devkit/skills/embedded/vercel-optimize/lib/scanners/sveltekit-prerender-missing.mjs +43 -0
  503. devkit/skills/embedded/vercel-optimize/lib/scanners/turbo-force-bypass.mjs +129 -0
  504. devkit/skills/embedded/vercel-optimize/lib/scanners/unoptimized-image.mjs +113 -0
  505. devkit/skills/embedded/vercel-optimize/lib/scanners/use-cache-date-stamp.mjs +106 -0
  506. devkit/skills/embedded/vercel-optimize/lib/support-topics.mjs +355 -0
  507. devkit/skills/embedded/vercel-optimize/lib/throttle.mjs +273 -0
  508. devkit/skills/embedded/vercel-optimize/lib/util.mjs +17 -0
  509. devkit/skills/embedded/vercel-optimize/lib/vercel.mjs +864 -0
  510. devkit/skills/embedded/vercel-optimize/lib/verify-claim.mjs +1296 -0
  511. devkit/skills/embedded/vercel-optimize/lib/workspace-resolver.mjs +521 -0
  512. devkit/skills/embedded/vercel-optimize/references/candidates.md +176 -0
  513. devkit/skills/embedded/vercel-optimize/references/data-collection.md +218 -0
  514. devkit/skills/embedded/vercel-optimize/references/docs-library.json +683 -0
  515. devkit/skills/embedded/vercel-optimize/references/doctrine.md +105 -0
  516. devkit/skills/embedded/vercel-optimize/references/observability-plus.md +108 -0
  517. devkit/skills/embedded/vercel-optimize/references/playbooks/README.md +53 -0
  518. devkit/skills/embedded/vercel-optimize/references/playbooks/ai-application.md +32 -0
  519. devkit/skills/embedded/vercel-optimize/references/playbooks/api-service.md +30 -0
  520. devkit/skills/embedded/vercel-optimize/references/playbooks/content-site.md +30 -0
  521. devkit/skills/embedded/vercel-optimize/references/playbooks/ecommerce.md +30 -0
  522. devkit/skills/embedded/vercel-optimize/references/playbooks/marketing.md +30 -0
  523. devkit/skills/embedded/vercel-optimize/references/playbooks/saas.md +31 -0
  524. devkit/skills/embedded/vercel-optimize/references/playbooks/sveltekit.md +75 -0
  525. devkit/skills/embedded/vercel-optimize/references/recommendations.md +203 -0
  526. devkit/skills/embedded/vercel-optimize/references/scanner-patterns.md +251 -0
  527. devkit/skills/embedded/vercel-optimize/references/scoring.md +205 -0
  528. devkit/skills/embedded/vercel-optimize/references/support-topics/README.md +46 -0
  529. devkit/skills/embedded/vercel-optimize/references/support-topics/astro-edge-middleware-scope.md +22 -0
  530. devkit/skills/embedded/vercel-optimize/references/support-topics/astro-output-mode-and-isr.md +22 -0
  531. devkit/skills/embedded/vercel-optimize/references/support-topics/auth-preserving-parallelization.md +22 -0
  532. devkit/skills/embedded/vercel-optimize/references/support-topics/bot-protection-product-guardrails.md +22 -0
  533. devkit/skills/embedded/vercel-optimize/references/support-topics/build-minutes-monorepo-fanout.md +23 -0
  534. devkit/skills/embedded/vercel-optimize/references/support-topics/cache-components-static-shell-boundaries.md +22 -0
  535. devkit/skills/embedded/vercel-optimize/references/support-topics/cache-components-suspense-dedupe-pitfall.md +23 -0
  536. devkit/skills/embedded/vercel-optimize/references/support-topics/cdn-cache-auth-safety.md +22 -0
  537. devkit/skills/embedded/vercel-optimize/references/support-topics/cold-start-initialization-bundle.md +22 -0
  538. devkit/skills/embedded/vercel-optimize/references/support-topics/core-web-vitals-client-bottlenecks.md +22 -0
  539. devkit/skills/embedded/vercel-optimize/references/support-topics/database-egress-pooling-region.md +22 -0
  540. devkit/skills/embedded/vercel-optimize/references/support-topics/dynamic-rendering-traps.md +22 -0
  541. devkit/skills/embedded/vercel-optimize/references/support-topics/external-api-critical-path-platform.md +22 -0
  542. devkit/skills/embedded/vercel-optimize/references/support-topics/external-api-critical-path.md +22 -0
  543. devkit/skills/embedded/vercel-optimize/references/support-topics/fast-data-transfer-payloads.md +22 -0
  544. devkit/skills/embedded/vercel-optimize/references/support-topics/fluid-compute-caveats.md +22 -0
  545. devkit/skills/embedded/vercel-optimize/references/support-topics/function-duration-io-and-after.md +22 -0
  546. devkit/skills/embedded/vercel-optimize/references/support-topics/function-invocation-reduction.md +22 -0
  547. devkit/skills/embedded/vercel-optimize/references/support-topics/function-region-misconfiguration-ttfb.md +23 -0
  548. devkit/skills/embedded/vercel-optimize/references/support-topics/image-optimization-cost-control.md +22 -0
  549. devkit/skills/embedded/vercel-optimize/references/support-topics/isr-revalidation-static-generation.md +22 -0
  550. devkit/skills/embedded/vercel-optimize/references/support-topics/middleware-proxy-edge-cost.md +22 -0
  551. devkit/skills/embedded/vercel-optimize/references/support-topics/next-fetch-revalidate-floor.md +22 -0
  552. devkit/skills/embedded/vercel-optimize/references/support-topics/next-font-cls-self-hosting.md +23 -0
  553. devkit/skills/embedded/vercel-optimize/references/support-topics/next-heavy-ui-lazy-load-boundaries.md +23 -0
  554. devkit/skills/embedded/vercel-optimize/references/support-topics/next-image-lcp-preload-sizes.md +23 -0
  555. devkit/skills/embedded/vercel-optimize/references/support-topics/next-route-handler-get-cache-defaults.md +22 -0
  556. devkit/skills/embedded/vercel-optimize/references/support-topics/next-script-third-party-strategy.md +23 -0
  557. devkit/skills/embedded/vercel-optimize/references/support-topics/nextjs-version-cache-semantics.md +22 -0
  558. devkit/skills/embedded/vercel-optimize/references/support-topics/not-found-catchall-request-waste.md +23 -0
  559. devkit/skills/embedded/vercel-optimize/references/support-topics/nuxt-route-rules-cache-isr.md +22 -0
  560. devkit/skills/embedded/vercel-optimize/references/support-topics/observability-events-cost-attribution.md +22 -0
  561. devkit/skills/embedded/vercel-optimize/references/support-topics/post-response-work-waituntil.md +22 -0
  562. devkit/skills/embedded/vercel-optimize/references/support-topics/route-error-durable-offload.md +22 -0
  563. devkit/skills/embedded/vercel-optimize/references/support-topics/route-error-runtime-limits.md +22 -0
  564. devkit/skills/embedded/vercel-optimize/references/support-topics/runtime-cache-reusable-data.md +22 -0
  565. devkit/skills/embedded/vercel-optimize/references/support-topics/sveltekit-isr-prerender-safety.md +22 -0
  566. devkit/skills/embedded/vercel-optimize/references/support-topics/sveltekit-split-cold-start-tradeoff.md +22 -0
  567. devkit/skills/embedded/vercel-optimize/references/support-topics/usage-spike-triage.md +22 -0
  568. devkit/skills/embedded/vercel-optimize/references/support-topics/use-cache-date-stamp-isr-write-amplifier.md +23 -0
  569. devkit/skills/embedded/vercel-optimize/references/support-topics/use-cache-remote-shared-origin-data.md +22 -0
  570. devkit/skills/embedded/vercel-optimize/references/support-topics/workflow-resumable-stream-routes.md +23 -0
  571. devkit/skills/embedded/vercel-optimize/references/verification.md +102 -0
  572. devkit/skills/embedded/vercel-optimize/references/voice.md +76 -0
  573. devkit/skills/embedded/vercel-optimize/scripts/budget-summary.mjs +56 -0
  574. devkit/skills/embedded/vercel-optimize/scripts/build-docs.mjs +74 -0
  575. devkit/skills/embedded/vercel-optimize/scripts/check-citations.mjs +81 -0
  576. devkit/skills/embedded/vercel-optimize/scripts/check-docs-fresh.mjs +93 -0
  577. devkit/skills/embedded/vercel-optimize/scripts/collect-signals.mjs +576 -0
  578. devkit/skills/embedded/vercel-optimize/scripts/collect-sub-agent-outputs.mjs +296 -0
  579. devkit/skills/embedded/vercel-optimize/scripts/deep-dive.mjs +319 -0
  580. devkit/skills/embedded/vercel-optimize/scripts/gate-investigations.mjs +166 -0
  581. devkit/skills/embedded/vercel-optimize/scripts/merge-signals.mjs +192 -0
  582. devkit/skills/embedded/vercel-optimize/scripts/prepare-investigation-brief.mjs +231 -0
  583. devkit/skills/embedded/vercel-optimize/scripts/reconcile-candidates.mjs +62 -0
  584. devkit/skills/embedded/vercel-optimize/scripts/render-report.mjs +437 -0
  585. devkit/skills/embedded/vercel-optimize/scripts/scan-codebase.mjs +313 -0
  586. devkit/skills/embedded/vercel-optimize/scripts/verify-and-regen.mjs +346 -0
  587. devkit/skills/embedded/vercel-optimize/scripts/verify-finding.mjs +19 -0
  588. devkit/skills/embedded/vercel-react-best-practices/AGENTS.md +3810 -0
  589. devkit/skills/embedded/vercel-react-best-practices/README.md +123 -0
  590. devkit/skills/embedded/vercel-react-best-practices/SKILL.md +149 -0
  591. devkit/skills/embedded/vercel-react-best-practices/rules/_sections.md +46 -0
  592. devkit/skills/embedded/vercel-react-best-practices/rules/_template.md +28 -0
  593. devkit/skills/embedded/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  594. devkit/skills/embedded/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  595. devkit/skills/embedded/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  596. devkit/skills/embedded/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  597. devkit/skills/embedded/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  598. devkit/skills/embedded/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  599. devkit/skills/embedded/vercel-react-best-practices/rules/async-defer-await.md +82 -0
  600. devkit/skills/embedded/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  601. devkit/skills/embedded/vercel-react-best-practices/rules/async-parallel.md +28 -0
  602. devkit/skills/embedded/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  603. devkit/skills/embedded/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
  604. devkit/skills/embedded/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
  605. devkit/skills/embedded/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  606. devkit/skills/embedded/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  607. devkit/skills/embedded/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  608. devkit/skills/embedded/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  609. devkit/skills/embedded/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  610. devkit/skills/embedded/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  611. devkit/skills/embedded/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  612. devkit/skills/embedded/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  613. devkit/skills/embedded/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  614. devkit/skills/embedded/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  615. devkit/skills/embedded/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  616. devkit/skills/embedded/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  617. devkit/skills/embedded/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  618. devkit/skills/embedded/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  619. devkit/skills/embedded/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  620. devkit/skills/embedded/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  621. devkit/skills/embedded/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  622. devkit/skills/embedded/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  623. devkit/skills/embedded/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  624. devkit/skills/embedded/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
  625. devkit/skills/embedded/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  626. devkit/skills/embedded/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  627. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  628. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  629. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  630. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  631. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  632. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  633. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  634. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  635. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  636. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  637. devkit/skills/embedded/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  638. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  639. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  640. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  641. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  642. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  643. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  644. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  645. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  646. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  647. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  648. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  649. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  650. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  651. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  652. devkit/skills/embedded/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  653. devkit/skills/embedded/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  654. devkit/skills/embedded/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  655. devkit/skills/embedded/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  656. devkit/skills/embedded/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  657. devkit/skills/embedded/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  658. devkit/skills/embedded/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
  659. devkit/skills/embedded/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
  660. devkit/skills/embedded/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  661. devkit/skills/embedded/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  662. devkit/skills/embedded/vercel-react-best-practices/rules/server-serialization.md +38 -0
  663. devkit/skills/embedded/vercel-react-native-skills/AGENTS.md +2897 -0
  664. devkit/skills/embedded/vercel-react-native-skills/README.md +165 -0
  665. devkit/skills/embedded/vercel-react-native-skills/SKILL.md +121 -0
  666. devkit/skills/embedded/vercel-react-native-skills/rules/_sections.md +86 -0
  667. devkit/skills/embedded/vercel-react-native-skills/rules/_template.md +28 -0
  668. devkit/skills/embedded/vercel-react-native-skills/rules/animation-derived-value.md +53 -0
  669. devkit/skills/embedded/vercel-react-native-skills/rules/animation-gesture-detector-press.md +95 -0
  670. devkit/skills/embedded/vercel-react-native-skills/rules/animation-gpu-properties.md +65 -0
  671. devkit/skills/embedded/vercel-react-native-skills/rules/design-system-compound-components.md +66 -0
  672. devkit/skills/embedded/vercel-react-native-skills/rules/fonts-config-plugin.md +71 -0
  673. devkit/skills/embedded/vercel-react-native-skills/rules/imports-design-system-folder.md +68 -0
  674. devkit/skills/embedded/vercel-react-native-skills/rules/js-hoist-intl.md +61 -0
  675. devkit/skills/embedded/vercel-react-native-skills/rules/list-performance-callbacks.md +44 -0
  676. devkit/skills/embedded/vercel-react-native-skills/rules/list-performance-function-references.md +132 -0
  677. devkit/skills/embedded/vercel-react-native-skills/rules/list-performance-images.md +53 -0
  678. devkit/skills/embedded/vercel-react-native-skills/rules/list-performance-inline-objects.md +97 -0
  679. devkit/skills/embedded/vercel-react-native-skills/rules/list-performance-item-expensive.md +94 -0
  680. devkit/skills/embedded/vercel-react-native-skills/rules/list-performance-item-memo.md +82 -0
  681. devkit/skills/embedded/vercel-react-native-skills/rules/list-performance-item-types.md +104 -0
  682. devkit/skills/embedded/vercel-react-native-skills/rules/list-performance-virtualize.md +67 -0
  683. devkit/skills/embedded/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
  684. devkit/skills/embedded/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
  685. devkit/skills/embedded/vercel-react-native-skills/rules/navigation-native-navigators.md +188 -0
  686. devkit/skills/embedded/vercel-react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
  687. devkit/skills/embedded/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
  688. devkit/skills/embedded/vercel-react-native-skills/rules/react-state-dispatcher.md +91 -0
  689. devkit/skills/embedded/vercel-react-native-skills/rules/react-state-fallback.md +56 -0
  690. devkit/skills/embedded/vercel-react-native-skills/rules/react-state-minimize.md +65 -0
  691. devkit/skills/embedded/vercel-react-native-skills/rules/rendering-no-falsy-and.md +74 -0
  692. devkit/skills/embedded/vercel-react-native-skills/rules/rendering-text-in-text-component.md +36 -0
  693. devkit/skills/embedded/vercel-react-native-skills/rules/scroll-position-no-state.md +82 -0
  694. devkit/skills/embedded/vercel-react-native-skills/rules/state-ground-truth.md +80 -0
  695. devkit/skills/embedded/vercel-react-native-skills/rules/ui-expo-image.md +66 -0
  696. devkit/skills/embedded/vercel-react-native-skills/rules/ui-image-gallery.md +104 -0
  697. devkit/skills/embedded/vercel-react-native-skills/rules/ui-measure-views.md +78 -0
  698. devkit/skills/embedded/vercel-react-native-skills/rules/ui-menus.md +174 -0
  699. devkit/skills/embedded/vercel-react-native-skills/rules/ui-native-modals.md +77 -0
  700. devkit/skills/embedded/vercel-react-native-skills/rules/ui-pressable.md +61 -0
  701. devkit/skills/embedded/vercel-react-native-skills/rules/ui-safe-area-scroll.md +65 -0
  702. devkit/skills/embedded/vercel-react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
  703. devkit/skills/embedded/vercel-react-native-skills/rules/ui-styling.md +87 -0
  704. devkit/skills/embedded/vercel-react-view-transitions/AGENTS.md +1380 -0
  705. devkit/skills/embedded/vercel-react-view-transitions/README.md +44 -0
  706. devkit/skills/embedded/vercel-react-view-transitions/SKILL.md +332 -0
  707. devkit/skills/embedded/vercel-react-view-transitions/references/css-recipes.md +312 -0
  708. devkit/skills/embedded/vercel-react-view-transitions/references/implementation.md +170 -0
  709. devkit/skills/embedded/vercel-react-view-transitions/references/nextjs.md +233 -0
  710. devkit/skills/embedded/vercel-react-view-transitions/references/patterns.md +274 -0
  711. devkit/skills/embedded/vercel-react-view-transitions/references/troubleshooting.md +47 -0
  712. devkit/skills/embedded/web-design-guidelines/SKILL.md +39 -0
  713. devkit/skills/embedded/write-swift/SKILL.md +396 -0
  714. devkit/skills/embedded/writing-guidelines/SKILL.md +39 -0
  715. devkit/skills/installer.py +110 -0
  716. devkit/templates/__init__.py +76 -0
  717. devkit/templates/ai_agents_python.py +160 -0
  718. devkit/templates/base.py +37 -0
  719. devkit/templates/content_site.py +117 -0
  720. devkit/templates/custom.py +129 -0
  721. devkit/templates/design_system.py +167 -0
  722. devkit/templates/expo_fullstack.py +278 -0
  723. devkit/templates/expo_mobile.py +127 -0
  724. devkit/templates/minimal_agentic.py +34 -0
  725. devkit/templates/nextjs.py +219 -0
  726. devkit/templates/python_fastapi.py +125 -0
  727. devkit/templates/saas_fullstack.py +212 -0
  728. devkit/templates/vite_react.py +176 -0
  729. devkit/ui.py +61 -0
  730. devkit/utils/__init__.py +15 -0
  731. devkit/utils/system.py +48 -0
@@ -0,0 +1,812 @@
1
+ #!/usr/bin/env python3
2
+ """Logo generation with Gemini, Atlas Cloud, or MuAPI.
3
+
4
+ Gemini remains the default provider. Atlas Cloud is opt-in with
5
+ ``--provider atlas`` and uses its asynchronous image generation API. MuAPI is
6
+ opt-in with ``--provider muapi`` and uses its asynchronous image generation API
7
+ with the selected model's prompt/aspect-ratio contract.
8
+
9
+ Models:
10
+ - Nano Banana (default): gemini-2.5-flash-image - fast, high-volume, low-latency
11
+ - Nano Banana Pro (--pro): gemini-3-pro-image - professional quality, advanced reasoning
12
+ - MuAPI Nano Banana (--provider muapi): nano-banana - hosted asynchronous image generation
13
+
14
+ Set GEMINI_FLASH_IMAGE_MODEL or GEMINI_PRO_IMAGE_MODEL to use another Gemini
15
+ model id, for example when Google retires one of these.
16
+
17
+ Gemini returns PNG or JPEG data. The file gets the extension of the returned
18
+ type, so ``--output logo.png`` can be saved as ``logo.jpg``; the path actually
19
+ written is printed.
20
+
21
+ Exit status is 1 when nothing was generated: a failed single request, or a
22
+ batch where every variant failed. A batch where some variants succeed exits 0
23
+ and reports how many were generated.
24
+
25
+ Usage:
26
+ python generate.py --prompt "tech startup logo minimalist blue"
27
+ python generate.py --prompt "coffee shop vintage badge" --style vintage --output logo.png
28
+ python generate.py --brand "TechFlow" --industry tech --style minimalist
29
+ python generate.py --brand "TechFlow" --pro # Use Nano Banana Pro model
30
+ python generate.py --brand "TechFlow" --provider atlas
31
+ python generate.py --brand "TechFlow" --provider muapi
32
+ python generate.py --brand "TechFlow" --provider muapi --muapi-model nano-banana-pro
33
+
34
+ Batch mode (generates multiple variants):
35
+ python generate.py --brand "Unikorn" --batch 9 --output-dir ./logos --pro
36
+ """
37
+
38
+ import argparse
39
+ import ipaddress
40
+ import json
41
+ import os
42
+ import sys
43
+ import time
44
+ from datetime import datetime
45
+ from pathlib import Path
46
+ from urllib.error import HTTPError, URLError
47
+ from urllib.parse import urlparse
48
+ from urllib.request import HTTPRedirectHandler, Request, build_opener
49
+
50
+
51
+ # Load environment variables
52
+ def load_env():
53
+ """Load .env files in priority order"""
54
+ env_paths = [
55
+ Path(__file__).parent.parent.parent / ".env",
56
+ Path.home() / ".claude" / "skills" / ".env",
57
+ Path.home() / ".claude" / ".env",
58
+ ]
59
+
60
+ for env_path in env_paths:
61
+ if env_path.exists():
62
+ with open(env_path) as f:
63
+ for line in f:
64
+ line = line.strip()
65
+ if line and not line.startswith("#") and "=" in line:
66
+ key, value = line.split("=", 1)
67
+ if key not in os.environ:
68
+ os.environ[key] = value.strip("\"'")
69
+
70
+
71
+ load_env()
72
+
73
+
74
+ # ============ CONFIGURATION ============
75
+ GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
76
+ ATLASCLOUD_API_KEY = os.environ.get("ATLASCLOUD_API_KEY")
77
+ MUAPI_API_KEY = os.environ.get("MUAPI_API_KEY")
78
+
79
+ # Gemini "Nano Banana" model configurations for image generation
80
+ GEMINI_FLASH = (
81
+ os.environ.get("GEMINI_FLASH_IMAGE_MODEL") or "gemini-2.5-flash-image"
82
+ ) # Nano Banana: fast, high-volume, low-latency
83
+ GEMINI_PRO = (
84
+ os.environ.get("GEMINI_PRO_IMAGE_MODEL") or "gemini-3-pro-image"
85
+ ) # Nano Banana Pro: professional quality, advanced reasoning
86
+
87
+ # File extensions for the image types Gemini returns as inline data
88
+ IMAGE_EXTENSIONS = {"image/png": ".png", "image/jpeg": ".jpg", "image/webp": ".webp"}
89
+
90
+ # Atlas Cloud model validated against the live model catalog and schema.
91
+ ATLAS_MODEL = "google/nano-banana-2-lite/text-to-image"
92
+ ATLAS_API_BASE = "https://api.atlascloud.ai/api/v1"
93
+ MUAPI_MODEL = "nano-banana"
94
+ MUAPI_MODELS = ("nano-banana", "nano-banana-pro")
95
+ MUAPI_API_BASE = "https://api.muapi.ai/api/v1"
96
+ HTTP_USER_AGENT = "ui-ux-pro-max/2.5 (logo generation)"
97
+ ATLAS_POLL_INTERVAL = 2
98
+ ATLAS_MAX_POLLS = 90
99
+ MUAPI_POLL_INTERVAL = 2
100
+ MUAPI_MAX_POLLS = 90
101
+
102
+ # Supported aspect ratios
103
+ ASPECT_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4"]
104
+ DEFAULT_ASPECT_RATIO = "1:1" # Square is ideal for logos
105
+
106
+ # Logo-specific prompt templates
107
+ LOGO_PROMPT_TEMPLATE = """Generate a professional logo image: {prompt}
108
+
109
+ Style requirements:
110
+ - Clean vector-style illustration suitable for a logo
111
+ - Simple, scalable design that works at any size
112
+ - Clear silhouette and recognizable shape
113
+ - Professional quality suitable for business use
114
+ - Centered composition on plain white or transparent background
115
+ - No text unless specifically requested
116
+ - High contrast and clear edges
117
+ - Square format, perfectly centered
118
+ - Output as a clean, high-quality logo image
119
+ """
120
+
121
+ STYLE_MODIFIERS = {
122
+ "minimalist": "minimalist, simple geometric shapes, clean lines, lots of white space, single color or limited palette",
123
+ "vintage": "vintage, retro, badge style, distressed texture, heritage feel, warm earth tones",
124
+ "modern": "modern, sleek, gradient colors, tech-forward, innovative feel",
125
+ "luxury": "luxury, elegant, gold accents, refined, premium feel, serif typography",
126
+ "playful": "playful, fun, colorful, friendly, approachable, rounded shapes",
127
+ "corporate": "corporate, professional, trustworthy, stable, conservative colors",
128
+ "organic": "organic, natural, flowing lines, earth tones, sustainable feel",
129
+ "geometric": "geometric, abstract, mathematical precision, symmetrical",
130
+ "hand-drawn": "hand-drawn, artisan, sketch-like, authentic, imperfect lines",
131
+ "3d": "3D, dimensional, depth, shadows, isometric perspective",
132
+ "abstract": "abstract mark, conceptual, symbolic, non-literal representation, artistic interpretation",
133
+ "lettermark": "lettermark, single letter or initials, typographic, monogram style, distinctive character",
134
+ "wordmark": "wordmark, logotype, custom typography, brand name as logo, distinctive lettering",
135
+ "emblem": "emblem, badge, crest style, enclosed design, traditional, authoritative feel",
136
+ "mascot": "mascot, character, friendly face, personified, memorable figure",
137
+ "gradient": "gradient, color transition, vibrant, modern digital feel, smooth color flow",
138
+ "lineart": "line art, single stroke, continuous line, elegant simplicity, wire-frame style",
139
+ "negative-space": "negative space, clever use of white space, hidden meaning, dual imagery, optical illusion",
140
+ }
141
+
142
+ INDUSTRY_PROMPTS = {
143
+ "tech": "technology company, digital, innovative, modern, circuit-like elements",
144
+ "healthcare": "healthcare, medical, caring, trust, cross or heart symbol",
145
+ "finance": "financial services, stable, trustworthy, growth, upward elements",
146
+ "food": "food and beverage, appetizing, warm colors, welcoming",
147
+ "fashion": "fashion brand, elegant, stylish, refined, artistic",
148
+ "fitness": "fitness and sports, dynamic, energetic, powerful, movement",
149
+ "eco": "eco-friendly, sustainable, natural, green, leaf or earth elements",
150
+ "education": "education, knowledge, growth, learning, book or cap symbol",
151
+ "real-estate": "real estate, property, home, roof or building silhouette",
152
+ "creative": "creative agency, artistic, unique, expressive, colorful",
153
+ }
154
+
155
+
156
+ def enhance_prompt(base_prompt, style=None, industry=None, brand_name=None):
157
+ """Enhance the logo prompt with style and industry modifiers"""
158
+ prompt_parts = [base_prompt]
159
+
160
+ if style and style in STYLE_MODIFIERS:
161
+ prompt_parts.append(STYLE_MODIFIERS[style])
162
+
163
+ if industry and industry in INDUSTRY_PROMPTS:
164
+ prompt_parts.append(INDUSTRY_PROMPTS[industry])
165
+
166
+ if brand_name:
167
+ prompt_parts.insert(0, f"Logo for '{brand_name}':")
168
+
169
+ combined = ", ".join(prompt_parts)
170
+ return LOGO_PROMPT_TEMPLATE.format(prompt=combined)
171
+
172
+
173
+ class _SafeRedirectHandler(HTTPRedirectHandler):
174
+ """Reject redirects to non-public or non-HTTPS destinations."""
175
+
176
+ def redirect_request(self, req, fp, code, msg, headers, newurl):
177
+ _validate_public_https_url(newurl)
178
+ return super().redirect_request(req, fp, code, msg, headers, newurl)
179
+
180
+
181
+ def _validate_public_https_url(url):
182
+ parsed = urlparse(url)
183
+ if (
184
+ parsed.scheme != "https"
185
+ or not parsed.hostname
186
+ or parsed.username
187
+ or parsed.password
188
+ ):
189
+ raise ValueError("Provider returned an invalid media URL")
190
+
191
+ hostname = parsed.hostname.lower().rstrip(".")
192
+ if hostname == "localhost" or hostname.endswith(
193
+ (".localhost", ".local", ".internal")
194
+ ):
195
+ raise ValueError("Provider media URL used a local hostname")
196
+
197
+ try:
198
+ ip = ipaddress.ip_address(hostname)
199
+ except ValueError:
200
+ return
201
+ else:
202
+ if not ip.is_global:
203
+ raise ValueError("Provider media URL used a non-public address")
204
+
205
+
206
+ def _json_request(
207
+ url, api_key, method="GET", payload=None, api_key_header="Authorization"
208
+ ):
209
+ if api_key_header == "Authorization":
210
+ auth_value = f"Bearer {api_key}"
211
+ elif api_key_header == "x-api-key":
212
+ auth_value = api_key
213
+ else:
214
+ raise ValueError("Unsupported API key header")
215
+
216
+ body = json.dumps(payload).encode("utf-8") if payload is not None else None
217
+ request = Request(
218
+ url,
219
+ data=body,
220
+ method=method,
221
+ headers={
222
+ api_key_header: auth_value,
223
+ "Accept": "application/json",
224
+ "User-Agent": HTTP_USER_AGENT,
225
+ **({"Content-Type": "application/json"} if body is not None else {}),
226
+ },
227
+ )
228
+ try:
229
+ with build_opener(_SafeRedirectHandler()).open(request, timeout=60) as response:
230
+ return json.loads(response.read().decode("utf-8"))
231
+ except HTTPError as exc:
232
+ detail = exc.read().decode("utf-8", errors="replace")
233
+ raise RuntimeError(
234
+ f"Provider request failed ({exc.code}): {detail[:300]}"
235
+ ) from exc
236
+ except (URLError, TimeoutError, json.JSONDecodeError) as exc:
237
+ raise RuntimeError(f"Provider request failed: {exc}") from exc
238
+
239
+
240
+ def _atlas_prediction_data(response):
241
+ if not isinstance(response, dict):
242
+ raise TypeError("Atlas Cloud returned an invalid response")
243
+ if response.get("code") not in (None, 0, 200):
244
+ raise RuntimeError(response.get("message") or "Atlas Cloud request failed")
245
+ data = response.get("data")
246
+ if not isinstance(data, dict):
247
+ raise TypeError("Atlas Cloud response did not include prediction data")
248
+ return data
249
+
250
+
251
+ def _download_atlas_image(url, output_path):
252
+ _download_image(url, output_path, "image provider")
253
+
254
+
255
+ def _download_image(url, output_path, provider_name):
256
+ _validate_public_https_url(url)
257
+ request = Request(
258
+ url,
259
+ headers={"Accept": "image/*", "User-Agent": HTTP_USER_AGENT},
260
+ )
261
+ try:
262
+ with build_opener(_SafeRedirectHandler()).open(
263
+ request, timeout=120
264
+ ) as response:
265
+ content_type = response.headers.get_content_type()
266
+ if not content_type.startswith("image/"):
267
+ raise RuntimeError(
268
+ f"{provider_name} output is not an image ({content_type})"
269
+ )
270
+ image_data = response.read()
271
+ except (HTTPError, URLError, TimeoutError) as exc:
272
+ raise RuntimeError(f"Unable to download {provider_name} image: {exc}") from exc
273
+
274
+ if not image_data:
275
+ raise RuntimeError(f"{provider_name} returned an empty image")
276
+ with open(output_path, "wb") as output_file:
277
+ output_file.write(image_data)
278
+
279
+
280
+ def _generate_with_atlas(prompt, output_path, aspect_ratio, api_key, model):
281
+ if not api_key:
282
+ raise RuntimeError("ATLASCLOUD_API_KEY not set")
283
+
284
+ payload = {
285
+ "model": model,
286
+ "prompt": prompt,
287
+ "aspect_ratio": aspect_ratio,
288
+ }
289
+ response = _json_request(
290
+ f"{ATLAS_API_BASE}/model/generateImage",
291
+ api_key,
292
+ method="POST",
293
+ payload=payload,
294
+ )
295
+ data = _atlas_prediction_data(response)
296
+ prediction_id = data.get("id")
297
+ if not prediction_id:
298
+ raise RuntimeError("Atlas Cloud did not return a prediction ID")
299
+
300
+ for poll_number in range(ATLAS_MAX_POLLS + 1):
301
+ status = str(data.get("status", "")).lower()
302
+ if status == "completed":
303
+ outputs = data.get("outputs")
304
+ if (
305
+ not isinstance(outputs, list)
306
+ or not outputs
307
+ or not isinstance(outputs[0], str)
308
+ ):
309
+ raise RuntimeError("Atlas Cloud completed without an image URL")
310
+ _download_atlas_image(outputs[0], output_path)
311
+ return
312
+ if status in {"failed", "timeout", "canceled", "cancelled"}:
313
+ raise RuntimeError(data.get("error") or f"Atlas Cloud prediction {status}")
314
+ if poll_number == ATLAS_MAX_POLLS:
315
+ break
316
+ time.sleep(ATLAS_POLL_INTERVAL)
317
+ data = _atlas_prediction_data(
318
+ _json_request(
319
+ f"{ATLAS_API_BASE}/model/prediction/{prediction_id}",
320
+ api_key,
321
+ )
322
+ )
323
+
324
+ raise RuntimeError("Atlas Cloud prediction timed out while polling")
325
+
326
+
327
+ def _muapi_response_objects(response):
328
+ """Return the response and common MuAPI envelopes without guessing fields."""
329
+ if not isinstance(response, dict):
330
+ raise TypeError("MuAPI returned an invalid response")
331
+
332
+ objects = [response]
333
+ for key in ("data", "output", "result"):
334
+ value = response.get(key)
335
+ if isinstance(value, dict) and value not in objects:
336
+ objects.append(value)
337
+ return objects
338
+
339
+
340
+ def _muapi_response_value(response, keys):
341
+ for item in _muapi_response_objects(response):
342
+ for key in keys:
343
+ value = item.get(key)
344
+ if value not in (None, ""):
345
+ return value
346
+ return None
347
+
348
+
349
+ def _muapi_error(response):
350
+ value = _muapi_response_value(response, ("error", "message", "detail"))
351
+ if isinstance(value, str):
352
+ return value[:300]
353
+ return "MuAPI request failed"
354
+
355
+
356
+ def _muapi_result_url(response):
357
+ """Return the documented result URL from the creation response."""
358
+ for item in _muapi_response_objects(response):
359
+ urls = item.get("urls")
360
+ if not isinstance(urls, dict) or "get" not in urls:
361
+ continue
362
+
363
+ result_url = urls.get("get")
364
+ if not isinstance(result_url, str) or not result_url:
365
+ raise RuntimeError(
366
+ "MuAPI creation response did not include a valid HTTPS result URL"
367
+ )
368
+ try:
369
+ _validate_public_https_url(result_url)
370
+ except ValueError as exc:
371
+ raise RuntimeError(
372
+ "MuAPI creation response did not include a valid HTTPS result URL"
373
+ ) from exc
374
+ return result_url
375
+
376
+ raise RuntimeError(
377
+ "MuAPI creation response did not include a valid HTTPS result URL"
378
+ )
379
+
380
+
381
+ def _muapi_output_url(response):
382
+ for item in _muapi_response_objects(response):
383
+ outputs = item.get("outputs")
384
+ if isinstance(outputs, list):
385
+ for output in outputs:
386
+ if isinstance(output, str) and output.startswith("https://"):
387
+ return output
388
+ if isinstance(output, dict):
389
+ for key in ("url", "image_url"):
390
+ value = output.get(key)
391
+ if isinstance(value, str) and value.startswith("https://"):
392
+ return value
393
+ raise RuntimeError("MuAPI completed without an HTTPS image URL")
394
+
395
+
396
+ def _download_muapi_image(url, output_path):
397
+ _download_image(url, output_path, "MuAPI")
398
+
399
+
400
+ def _generate_with_muapi(prompt, output_path, aspect_ratio, api_key, model):
401
+ if not api_key:
402
+ raise RuntimeError("MUAPI_API_KEY not set")
403
+ if model not in MUAPI_MODELS:
404
+ raise RuntimeError(
405
+ f"Unsupported MuAPI logo model: {model}. "
406
+ f"Choose one of: {', '.join(MUAPI_MODELS)}"
407
+ )
408
+
409
+ payload = {
410
+ "prompt": prompt,
411
+ "aspect_ratio": aspect_ratio,
412
+ }
413
+ response = _json_request(
414
+ f"{MUAPI_API_BASE}/{model}",
415
+ api_key,
416
+ method="POST",
417
+ payload=payload,
418
+ api_key_header="x-api-key",
419
+ )
420
+ request_id = _muapi_response_value(response, ("request_id", "id"))
421
+ if not isinstance(request_id, str) or not request_id:
422
+ raise RuntimeError("MuAPI did not return a request ID")
423
+ result_url = _muapi_result_url(response)
424
+
425
+ data = response
426
+ for poll_number in range(MUAPI_MAX_POLLS + 1):
427
+ status = _muapi_response_value(data, ("status",))
428
+ normalized_status = str(status or "").lower()
429
+ if normalized_status in {"completed", "succeeded", "success"}:
430
+ _download_muapi_image(_muapi_output_url(data), output_path)
431
+ return
432
+ if normalized_status in {
433
+ "failed",
434
+ "error",
435
+ "timeout",
436
+ "canceled",
437
+ "cancelled",
438
+ }:
439
+ raise RuntimeError(f"MuAPI generation {normalized_status}: {_muapi_error(data)}")
440
+ if poll_number == MUAPI_MAX_POLLS:
441
+ break
442
+
443
+ time.sleep(MUAPI_POLL_INTERVAL)
444
+ data = _json_request(
445
+ result_url,
446
+ api_key,
447
+ api_key_header="x-api-key",
448
+ )
449
+
450
+ raise RuntimeError("MuAPI prediction timed out while polling")
451
+
452
+
453
+ def _path_for_image_type(output_path, mime_type):
454
+ """Return output_path with the extension of the returned image type.
455
+
456
+ An unknown image type keeps the requested path.
457
+ """
458
+ extension = IMAGE_EXTENSIONS.get(mime_type.split(";")[0].strip().lower())
459
+ path = Path(output_path)
460
+ suffix = path.suffix.lower()
461
+ if extension is None or suffix == extension or (suffix, extension) == (".jpeg", ".jpg"):
462
+ return output_path
463
+ return str(path.with_suffix(extension))
464
+
465
+
466
+ def _generate_with_gemini(prompt, output_path, aspect_ratio, use_pro):
467
+ """Generate with Gemini and return the path the image was saved to."""
468
+ if not GEMINI_API_KEY:
469
+ raise RuntimeError("GEMINI_API_KEY not set")
470
+
471
+ try:
472
+ from google import genai
473
+ from google.genai import types
474
+ except ImportError as exc:
475
+ raise RuntimeError(
476
+ "google-genai package not installed; run: pip install google-genai"
477
+ ) from exc
478
+
479
+ client = genai.Client(api_key=GEMINI_API_KEY)
480
+ model = GEMINI_PRO if use_pro else GEMINI_FLASH
481
+ response = client.models.generate_content(
482
+ model=model,
483
+ contents=prompt,
484
+ config=types.GenerateContentConfig(
485
+ response_modalities=["IMAGE", "TEXT"],
486
+ image_config=types.ImageConfig(aspect_ratio=aspect_ratio),
487
+ safety_settings=[
488
+ types.SafetySetting(
489
+ category="HARM_CATEGORY_HATE_SPEECH",
490
+ threshold="BLOCK_LOW_AND_ABOVE",
491
+ ),
492
+ types.SafetySetting(
493
+ category="HARM_CATEGORY_DANGEROUS_CONTENT",
494
+ threshold="BLOCK_LOW_AND_ABOVE",
495
+ ),
496
+ types.SafetySetting(
497
+ category="HARM_CATEGORY_SEXUALLY_EXPLICIT",
498
+ threshold="BLOCK_LOW_AND_ABOVE",
499
+ ),
500
+ types.SafetySetting(
501
+ category="HARM_CATEGORY_HARASSMENT",
502
+ threshold="BLOCK_LOW_AND_ABOVE",
503
+ ),
504
+ ],
505
+ ),
506
+ )
507
+
508
+ for part in response.candidates[0].content.parts:
509
+ if (
510
+ hasattr(part, "inline_data")
511
+ and part.inline_data
512
+ and part.inline_data.mime_type.startswith("image/")
513
+ ):
514
+ saved_path = _path_for_image_type(output_path, part.inline_data.mime_type)
515
+ if saved_path != output_path:
516
+ print(
517
+ f"Gemini returned {part.inline_data.mime_type}, "
518
+ f"so saving as {saved_path} instead of {output_path}"
519
+ )
520
+ with open(saved_path, "wb") as output_file:
521
+ output_file.write(part.inline_data.data)
522
+ return saved_path
523
+ raise RuntimeError("Gemini did not return an image")
524
+
525
+
526
+ def generate_logo(
527
+ prompt,
528
+ style=None,
529
+ industry=None,
530
+ brand_name=None,
531
+ output_path=None,
532
+ use_pro=False,
533
+ aspect_ratio=None,
534
+ provider="gemini",
535
+ atlas_model=ATLAS_MODEL,
536
+ muapi_model=MUAPI_MODEL,
537
+ ):
538
+ """Generate a logo using Gemini, Atlas Cloud, or MuAPI image generation.
539
+
540
+ Args:
541
+ aspect_ratio: Image aspect ratio. Options: "1:1", "16:9", "9:16", "4:3", "3:4"
542
+ Default is "1:1" (square) for logos.
543
+ """
544
+
545
+ # Enhance the prompt
546
+ full_prompt = enhance_prompt(prompt, style, industry, brand_name)
547
+
548
+ # Set aspect ratio (default to 1:1 for logos)
549
+ ratio = aspect_ratio if aspect_ratio in ASPECT_RATIOS else DEFAULT_ASPECT_RATIO
550
+
551
+ if output_path is None:
552
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") # noqa: DTZ005
553
+ brand_slug = brand_name.lower().replace(" ", "_") if brand_name else "logo"
554
+ output_path = f"{brand_slug}_{timestamp}.png"
555
+
556
+ if provider == "atlas":
557
+ model_label = f"Atlas Cloud ({atlas_model})"
558
+ elif provider == "muapi":
559
+ model_label = f"MuAPI ({muapi_model})"
560
+ else:
561
+ model_label = (
562
+ f"Nano Banana Pro ({GEMINI_PRO})"
563
+ if use_pro
564
+ else f"Nano Banana ({GEMINI_FLASH})"
565
+ )
566
+
567
+ print(f"Generating logo with {model_label}...")
568
+ print(f"Aspect ratio: {ratio}")
569
+ print(f"Prompt: {full_prompt[:150]}...")
570
+ print()
571
+
572
+ try:
573
+ if provider == "atlas":
574
+ _generate_with_atlas(
575
+ full_prompt,
576
+ output_path,
577
+ ratio,
578
+ ATLASCLOUD_API_KEY,
579
+ atlas_model,
580
+ )
581
+ elif provider == "muapi":
582
+ _generate_with_muapi(
583
+ full_prompt,
584
+ output_path,
585
+ ratio,
586
+ MUAPI_API_KEY,
587
+ muapi_model,
588
+ )
589
+ else:
590
+ output_path = _generate_with_gemini(full_prompt, output_path, ratio, use_pro)
591
+
592
+ print(f"Logo saved to: {output_path}")
593
+ return output_path
594
+
595
+ except Exception as exc: # noqa: BLE001 - provider SDK errors are not standardized
596
+ print(f"Error generating logo: {exc}")
597
+ return None
598
+
599
+
600
+ def generate_batch(
601
+ prompt,
602
+ brand_name,
603
+ count,
604
+ output_dir,
605
+ use_pro=False,
606
+ brand_context=None,
607
+ aspect_ratio=None,
608
+ provider="gemini",
609
+ atlas_model=ATLAS_MODEL,
610
+ muapi_model=MUAPI_MODEL,
611
+ ):
612
+ """Generate multiple logo variants with different styles"""
613
+
614
+ # Select appropriate styles for batch generation
615
+ batch_styles = [
616
+ ("minimalist", "Clean, simple geometric shape with minimal details"),
617
+ ("modern", "Sleek gradient with tech-forward aesthetic"),
618
+ ("geometric", "Abstract geometric patterns, mathematical precision"),
619
+ ("gradient", "Vibrant color transitions, modern digital feel"),
620
+ ("abstract", "Conceptual symbolic representation"),
621
+ ("lettermark", "Stylized letter 'U' as monogram"),
622
+ ("negative-space", "Clever use of negative space, hidden meaning"),
623
+ ("lineart", "Single stroke continuous line design"),
624
+ ("3d", "Dimensional design with depth and shadows"),
625
+ ]
626
+
627
+ # Ensure output directory exists
628
+ os.makedirs(output_dir, exist_ok=True)
629
+
630
+ results = []
631
+ model_label = (
632
+ f"Atlas Cloud ({atlas_model})"
633
+ if provider == "atlas"
634
+ else f"MuAPI ({muapi_model})"
635
+ if provider == "muapi"
636
+ else f"Nano Banana {'Pro' if use_pro else 'Flash'}"
637
+ )
638
+ ratio = aspect_ratio if aspect_ratio in ASPECT_RATIOS else DEFAULT_ASPECT_RATIO
639
+
640
+ print(f"\n{'=' * 60}")
641
+ print(f" BATCH LOGO GENERATION: {brand_name}")
642
+ print(f" Model: {model_label}")
643
+ print(f" Aspect Ratio: {ratio}")
644
+ print(f" Variants: {count}")
645
+ print(f" Output: {output_dir}")
646
+ print(f"{'=' * 60}\n")
647
+
648
+ for i in range(min(count, len(batch_styles))):
649
+ style_key, style_desc = batch_styles[i]
650
+
651
+ # Build enhanced prompt with brand context
652
+ enhanced_prompt = f"{prompt}, {style_desc}"
653
+ if brand_context:
654
+ enhanced_prompt = f"{brand_context}, {enhanced_prompt}"
655
+
656
+ # Generate filename
657
+ filename = f"{brand_name.lower().replace(' ', '_')}_{style_key}_{i + 1:02d}.png"
658
+ output_path = os.path.join(output_dir, filename)
659
+
660
+ print(f"[{i + 1}/{count}] Generating {style_key} variant...")
661
+
662
+ result = generate_logo(
663
+ prompt=enhanced_prompt,
664
+ style=style_key,
665
+ industry="tech",
666
+ brand_name=brand_name,
667
+ output_path=output_path,
668
+ use_pro=use_pro,
669
+ aspect_ratio=aspect_ratio,
670
+ provider=provider,
671
+ atlas_model=atlas_model,
672
+ muapi_model=muapi_model,
673
+ )
674
+
675
+ if result:
676
+ results.append(result)
677
+ print(f" ✓ Saved: {os.path.basename(result)}\n")
678
+ else:
679
+ print(f" ✗ Failed: {style_key}\n")
680
+
681
+ # Rate limiting between requests
682
+ if i < count - 1:
683
+ time.sleep(2)
684
+
685
+ print(f"\n{'=' * 60}")
686
+ print(f" BATCH COMPLETE: {len(results)}/{count} logos generated")
687
+ print(f"{'=' * 60}\n")
688
+
689
+ return results
690
+
691
+
692
+ def main():
693
+ parser = argparse.ArgumentParser(
694
+ description="Generate logos using Gemini, Atlas Cloud, or MuAPI"
695
+ )
696
+ parser.add_argument("--prompt", "-p", type=str, help="Logo description prompt")
697
+ parser.add_argument("--brand", "-b", type=str, help="Brand name")
698
+ parser.add_argument(
699
+ "--style", "-s", choices=list(STYLE_MODIFIERS.keys()), help="Logo style"
700
+ )
701
+ parser.add_argument(
702
+ "--industry", "-i", choices=list(INDUSTRY_PROMPTS.keys()), help="Industry type"
703
+ )
704
+ parser.add_argument("--output", "-o", type=str, help="Output file path")
705
+ parser.add_argument(
706
+ "--output-dir", type=str, help="Output directory for batch generation"
707
+ )
708
+ parser.add_argument(
709
+ "--batch", type=int, help="Number of logo variants to generate (batch mode)"
710
+ )
711
+ parser.add_argument(
712
+ "--brand-context", type=str, help="Additional brand context for prompts"
713
+ )
714
+ parser.add_argument(
715
+ "--pro",
716
+ action="store_true",
717
+ help=f"Use Nano Banana Pro ({GEMINI_PRO}) for professional quality",
718
+ )
719
+ parser.add_argument(
720
+ "--provider",
721
+ choices=["gemini", "atlas", "muapi"],
722
+ default="gemini",
723
+ help="Image provider (default: gemini)",
724
+ )
725
+ parser.add_argument(
726
+ "--atlas-model",
727
+ default=ATLAS_MODEL,
728
+ help=f"Atlas Cloud image model (default: {ATLAS_MODEL})",
729
+ )
730
+ parser.add_argument(
731
+ "--muapi-model",
732
+ choices=MUAPI_MODELS,
733
+ default=MUAPI_MODEL,
734
+ help=f"MuAPI image model (default: {MUAPI_MODEL})",
735
+ )
736
+ parser.add_argument(
737
+ "--aspect-ratio",
738
+ "-r",
739
+ choices=ASPECT_RATIOS,
740
+ default=DEFAULT_ASPECT_RATIO,
741
+ help=f"Image aspect ratio (default: {DEFAULT_ASPECT_RATIO} for logos)",
742
+ )
743
+ parser.add_argument(
744
+ "--list-styles", action="store_true", help="List available styles"
745
+ )
746
+ parser.add_argument(
747
+ "--list-industries", action="store_true", help="List available industries"
748
+ )
749
+
750
+ args = parser.parse_args()
751
+
752
+ if args.provider != "gemini" and args.pro:
753
+ parser.error(
754
+ "--pro is only available with --provider gemini; "
755
+ "use --muapi-model nano-banana-pro for MuAPI"
756
+ )
757
+
758
+ if args.list_styles:
759
+ print("Available styles:")
760
+ for style, desc in STYLE_MODIFIERS.items():
761
+ print(f" {style}: {desc[:60]}...")
762
+ return
763
+
764
+ if args.list_industries:
765
+ print("Available industries:")
766
+ for industry, desc in INDUSTRY_PROMPTS.items():
767
+ print(f" {industry}: {desc[:60]}...")
768
+ return
769
+
770
+ if not args.prompt and not args.brand:
771
+ parser.error("Either --prompt or --brand is required")
772
+
773
+ prompt = args.prompt or "professional logo"
774
+
775
+ # Batch mode
776
+ if args.batch:
777
+ output_dir = (
778
+ args.output_dir or f"./{args.brand.lower().replace(' ', '_')}_logos"
779
+ )
780
+ results = generate_batch(
781
+ prompt=prompt,
782
+ brand_name=args.brand or "Logo",
783
+ count=args.batch,
784
+ output_dir=output_dir,
785
+ use_pro=args.pro,
786
+ brand_context=args.brand_context,
787
+ aspect_ratio=args.aspect_ratio,
788
+ provider=args.provider,
789
+ atlas_model=args.atlas_model,
790
+ muapi_model=args.muapi_model,
791
+ )
792
+ if not results:
793
+ sys.exit(1)
794
+ else:
795
+ saved_path = generate_logo(
796
+ prompt=prompt,
797
+ style=args.style,
798
+ industry=args.industry,
799
+ brand_name=args.brand,
800
+ output_path=args.output,
801
+ use_pro=args.pro,
802
+ aspect_ratio=args.aspect_ratio,
803
+ provider=args.provider,
804
+ atlas_model=args.atlas_model,
805
+ muapi_model=args.muapi_model,
806
+ )
807
+ if saved_path is None:
808
+ sys.exit(1)
809
+
810
+
811
+ if __name__ == "__main__":
812
+ main()