moai-adk 0.35.1__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.

Potentially problematic release.


This version of moai-adk might be problematic. Click here for more details.

Files changed (502) hide show
  1. moai_adk/__init__.py +10 -0
  2. moai_adk/__main__.py +199 -0
  3. moai_adk/cli/__init__.py +6 -0
  4. moai_adk/cli/commands/__init__.py +17 -0
  5. moai_adk/cli/commands/analyze.py +116 -0
  6. moai_adk/cli/commands/doctor.py +272 -0
  7. moai_adk/cli/commands/init.py +372 -0
  8. moai_adk/cli/commands/language.py +248 -0
  9. moai_adk/cli/commands/status.py +104 -0
  10. moai_adk/cli/commands/update.py +2686 -0
  11. moai_adk/cli/main.py +13 -0
  12. moai_adk/cli/prompts/__init__.py +5 -0
  13. moai_adk/cli/prompts/init_prompts.py +219 -0
  14. moai_adk/cli/spec_status.py +263 -0
  15. moai_adk/cli/ui/__init__.py +44 -0
  16. moai_adk/cli/ui/progress.py +422 -0
  17. moai_adk/cli/ui/prompts.py +389 -0
  18. moai_adk/cli/ui/theme.py +129 -0
  19. moai_adk/cli/worktree/__init__.py +27 -0
  20. moai_adk/cli/worktree/__main__.py +31 -0
  21. moai_adk/cli/worktree/cli.py +683 -0
  22. moai_adk/cli/worktree/exceptions.py +89 -0
  23. moai_adk/cli/worktree/manager.py +493 -0
  24. moai_adk/cli/worktree/models.py +65 -0
  25. moai_adk/cli/worktree/registry.py +422 -0
  26. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  27. moai_adk/core/__init__.py +1 -0
  28. moai_adk/core/analysis/__init__.py +9 -0
  29. moai_adk/core/analysis/session_analyzer.py +400 -0
  30. moai_adk/core/claude_integration.py +393 -0
  31. moai_adk/core/command_helpers.py +270 -0
  32. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  33. moai_adk/core/config/__init__.py +19 -0
  34. moai_adk/core/config/auto_spec_config.py +340 -0
  35. moai_adk/core/config/migration.py +244 -0
  36. moai_adk/core/config/unified.py +436 -0
  37. moai_adk/core/context_manager.py +273 -0
  38. moai_adk/core/diagnostics/__init__.py +19 -0
  39. moai_adk/core/diagnostics/slash_commands.py +159 -0
  40. moai_adk/core/enterprise_features.py +1404 -0
  41. moai_adk/core/error_recovery_system.py +1902 -0
  42. moai_adk/core/event_driven_hook_system.py +1371 -0
  43. moai_adk/core/git/__init__.py +31 -0
  44. moai_adk/core/git/branch.py +25 -0
  45. moai_adk/core/git/branch_manager.py +129 -0
  46. moai_adk/core/git/checkpoint.py +134 -0
  47. moai_adk/core/git/commit.py +67 -0
  48. moai_adk/core/git/conflict_detector.py +413 -0
  49. moai_adk/core/git/event_detector.py +79 -0
  50. moai_adk/core/git/manager.py +216 -0
  51. moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
  52. moai_adk/core/input_validation_middleware.py +1006 -0
  53. moai_adk/core/integration/__init__.py +22 -0
  54. moai_adk/core/integration/engine.py +157 -0
  55. moai_adk/core/integration/integration_tester.py +226 -0
  56. moai_adk/core/integration/models.py +88 -0
  57. moai_adk/core/integration/utils.py +211 -0
  58. moai_adk/core/issue_creator.py +305 -0
  59. moai_adk/core/jit_context_loader.py +956 -0
  60. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  61. moai_adk/core/language_config.py +202 -0
  62. moai_adk/core/language_config_resolver.py +572 -0
  63. moai_adk/core/language_validator.py +543 -0
  64. moai_adk/core/mcp/setup.py +116 -0
  65. moai_adk/core/merge/__init__.py +9 -0
  66. moai_adk/core/merge/analyzer.py +605 -0
  67. moai_adk/core/migration/__init__.py +18 -0
  68. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  69. moai_adk/core/migration/backup_manager.py +277 -0
  70. moai_adk/core/migration/custom_element_scanner.py +358 -0
  71. moai_adk/core/migration/file_migrator.py +209 -0
  72. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  73. moai_adk/core/migration/selective_restorer.py +470 -0
  74. moai_adk/core/migration/template_utils.py +74 -0
  75. moai_adk/core/migration/user_selection_ui.py +338 -0
  76. moai_adk/core/migration/version_detector.py +139 -0
  77. moai_adk/core/migration/version_migrator.py +228 -0
  78. moai_adk/core/performance/__init__.py +6 -0
  79. moai_adk/core/performance/cache_system.py +316 -0
  80. moai_adk/core/performance/parallel_processor.py +116 -0
  81. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  82. moai_adk/core/project/__init__.py +1 -0
  83. moai_adk/core/project/backup_utils.py +70 -0
  84. moai_adk/core/project/checker.py +300 -0
  85. moai_adk/core/project/detector.py +293 -0
  86. moai_adk/core/project/initializer.py +387 -0
  87. moai_adk/core/project/phase_executor.py +716 -0
  88. moai_adk/core/project/validator.py +139 -0
  89. moai_adk/core/quality/__init__.py +6 -0
  90. moai_adk/core/quality/trust_checker.py +377 -0
  91. moai_adk/core/quality/validators/__init__.py +6 -0
  92. moai_adk/core/quality/validators/base_validator.py +19 -0
  93. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  94. moai_adk/core/robust_json_parser.py +611 -0
  95. moai_adk/core/rollback_manager.py +918 -0
  96. moai_adk/core/session_manager.py +651 -0
  97. moai_adk/core/skill_loading_system.py +579 -0
  98. moai_adk/core/spec/confidence_scoring.py +680 -0
  99. moai_adk/core/spec/ears_template_engine.py +1247 -0
  100. moai_adk/core/spec/quality_validator.py +687 -0
  101. moai_adk/core/spec_status_manager.py +478 -0
  102. moai_adk/core/template/__init__.py +7 -0
  103. moai_adk/core/template/backup.py +174 -0
  104. moai_adk/core/template/config.py +191 -0
  105. moai_adk/core/template/languages.py +43 -0
  106. moai_adk/core/template/merger.py +233 -0
  107. moai_adk/core/template/processor.py +1200 -0
  108. moai_adk/core/template_engine.py +310 -0
  109. moai_adk/core/template_variable_synchronizer.py +417 -0
  110. moai_adk/core/unified_permission_manager.py +745 -0
  111. moai_adk/core/user_behavior_analytics.py +851 -0
  112. moai_adk/core/version_sync.py +429 -0
  113. moai_adk/foundation/__init__.py +56 -0
  114. moai_adk/foundation/backend.py +1027 -0
  115. moai_adk/foundation/database.py +1115 -0
  116. moai_adk/foundation/devops.py +1585 -0
  117. moai_adk/foundation/ears.py +431 -0
  118. moai_adk/foundation/frontend.py +870 -0
  119. moai_adk/foundation/git/commit_templates.py +557 -0
  120. moai_adk/foundation/git.py +376 -0
  121. moai_adk/foundation/langs.py +484 -0
  122. moai_adk/foundation/ml_ops.py +1162 -0
  123. moai_adk/foundation/testing.py +1524 -0
  124. moai_adk/foundation/trust/trust_principles.py +676 -0
  125. moai_adk/foundation/trust/validation_checklist.py +1573 -0
  126. moai_adk/project/__init__.py +0 -0
  127. moai_adk/project/configuration.py +1084 -0
  128. moai_adk/project/documentation.py +566 -0
  129. moai_adk/project/schema.py +447 -0
  130. moai_adk/statusline/__init__.py +38 -0
  131. moai_adk/statusline/alfred_detector.py +105 -0
  132. moai_adk/statusline/config.py +376 -0
  133. moai_adk/statusline/enhanced_output_style_detector.py +372 -0
  134. moai_adk/statusline/git_collector.py +190 -0
  135. moai_adk/statusline/main.py +322 -0
  136. moai_adk/statusline/metrics_tracker.py +78 -0
  137. moai_adk/statusline/renderer.py +343 -0
  138. moai_adk/statusline/update_checker.py +129 -0
  139. moai_adk/statusline/version_reader.py +741 -0
  140. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
  141. moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
  142. moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
  143. moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
  144. moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
  145. moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
  146. moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
  147. moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
  148. moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
  149. moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
  150. moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
  151. moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
  152. moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
  153. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
  154. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
  155. moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
  156. moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
  157. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  158. moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
  159. moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
  160. moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
  161. moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
  162. moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
  163. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
  164. moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
  165. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
  166. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
  167. moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
  168. moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
  169. moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
  170. moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
  171. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  172. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  173. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  174. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  175. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  176. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  177. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  178. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  179. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  180. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  181. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  182. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  183. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  184. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  185. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  186. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  187. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  188. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  189. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
  190. moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
  191. moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
  192. moai_adk/templates/.claude/settings.json +172 -0
  193. moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
  194. moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
  195. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
  196. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
  197. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
  198. moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
  199. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  200. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  201. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  202. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  203. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  204. moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
  205. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
  206. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
  207. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
  208. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
  209. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
  210. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  211. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  212. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  213. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  214. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
  215. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
  216. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
  217. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
  218. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
  219. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  220. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  221. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  222. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  223. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  224. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  225. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
  226. moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
  227. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  228. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  229. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  230. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  231. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  232. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  233. moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
  234. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
  235. moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
  236. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  237. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  238. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  239. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  240. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  241. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  242. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  243. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  244. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  245. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  246. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  247. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  248. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  249. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  250. moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
  251. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
  252. moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
  253. moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
  254. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
  255. moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
  256. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  257. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
  258. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  259. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  260. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  261. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  262. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  263. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  264. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  265. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  266. moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
  267. moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
  268. moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
  269. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
  270. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
  271. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
  272. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
  273. moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
  274. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
  275. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  276. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  277. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  278. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  279. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  280. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  281. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  282. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  283. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  284. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
  285. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
  286. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
  287. moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
  288. moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
  289. moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
  290. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
  291. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
  292. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
  293. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
  294. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
  295. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
  296. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
  297. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
  298. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
  299. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
  300. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
  301. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
  302. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
  303. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
  304. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
  305. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
  306. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
  307. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
  308. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
  309. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
  310. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
  311. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
  312. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
  313. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
  314. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
  315. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
  316. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
  317. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
  318. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  319. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  320. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  321. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  322. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
  323. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  324. moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
  325. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  326. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  327. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  328. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  329. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  330. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  331. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  332. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  333. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  334. moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
  335. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
  336. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  337. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  338. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  339. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  340. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  341. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  342. moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
  343. moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
  344. moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
  345. moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
  346. moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
  347. moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
  348. moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
  349. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
  350. moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
  351. moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
  352. moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
  353. moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
  354. moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
  355. moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
  356. moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
  357. moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
  358. moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
  359. moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
  360. moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
  361. moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
  362. moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
  363. moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
  364. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
  365. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
  366. moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
  367. moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
  368. moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
  369. moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
  370. moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
  371. moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
  372. moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
  373. moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
  374. moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
  375. moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
  376. moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
  377. moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
  378. moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
  379. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
  380. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
  381. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
  382. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
  383. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
  384. moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
  385. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
  386. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
  387. moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
  388. moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
  389. moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
  390. moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
  391. moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
  392. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
  393. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  394. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
  395. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  396. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
  397. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  398. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
  399. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  400. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  401. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  402. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  403. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  404. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
  405. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  406. moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
  407. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  408. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  409. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  410. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  411. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  412. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  413. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  414. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  415. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  416. moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
  417. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  418. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
  419. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  420. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  421. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  422. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
  423. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  424. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  425. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  426. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  427. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  428. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  429. moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
  430. moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
  431. moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
  432. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
  433. moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
  434. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  435. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  436. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  437. moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
  438. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  439. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
  440. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  441. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  442. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  443. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  444. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  445. moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
  446. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  447. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  448. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  449. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  450. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  451. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  452. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  453. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  454. moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
  455. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  456. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  457. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  458. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
  459. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  460. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  461. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  462. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  463. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  464. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  465. moai_adk/templates/.git-hooks/pre-commit +128 -0
  466. moai_adk/templates/.git-hooks/pre-push +365 -0
  467. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  468. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  469. moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
  470. moai_adk/templates/.gitignore +222 -0
  471. moai_adk/templates/.mcp.json +13 -0
  472. moai_adk/templates/.moai/config/config.yaml +58 -0
  473. moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
  474. moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
  475. moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
  476. moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
  477. moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
  478. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
  479. moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
  480. moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
  481. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  482. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  483. moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
  484. moai_adk/templates/.moai/config/sections/system.yaml +24 -0
  485. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  486. moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
  487. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  488. moai_adk/templates/CLAUDE.md +642 -0
  489. moai_adk/utils/__init__.py +30 -0
  490. moai_adk/utils/banner.py +38 -0
  491. moai_adk/utils/common.py +294 -0
  492. moai_adk/utils/link_validator.py +241 -0
  493. moai_adk/utils/logger.py +147 -0
  494. moai_adk/utils/safe_file_reader.py +206 -0
  495. moai_adk/utils/timeout.py +160 -0
  496. moai_adk/utils/toon_utils.py +256 -0
  497. moai_adk/version.py +22 -0
  498. moai_adk-0.35.1.dist-info/METADATA +3018 -0
  499. moai_adk-0.35.1.dist-info/RECORD +502 -0
  500. moai_adk-0.35.1.dist-info/WHEEL +4 -0
  501. moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
  502. moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,560 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Nano Banana Pro - Batch Image Generation Script
4
+
5
+ Batch image generation using the gemini-3-pro-image-preview model (Nano Banana Pro).
6
+ Processes multiple prompts from JSON/YAML files or command line with smart rate limiting.
7
+
8
+ Features:
9
+ - JSON/YAML batch configuration files
10
+ - Parallel processing with concurrency control
11
+ - Exponential backoff for API quota errors
12
+ - Progress tracking and detailed reports
13
+ - Style inheritance from global settings
14
+ - Resume capability for interrupted batches
15
+
16
+ Usage:
17
+ python batch_generate.py -c prompts.json -d output/
18
+ python batch_generate.py -c prompts.yaml -d output/ --concurrency 3
19
+ python batch_generate.py --prompts "Cat" "Dog" "Bird" -d output/
20
+
21
+ Environment Variables Required:
22
+ GOOGLE_API_KEY - Your Google AI Studio API key
23
+
24
+ Model: gemini-3-pro-image-preview (hardcoded)
25
+ """
26
+
27
+ import argparse
28
+ import asyncio
29
+ import json
30
+ import os
31
+ import random
32
+ import sys
33
+ import time
34
+ from dataclasses import dataclass, field
35
+ from datetime import datetime
36
+ from pathlib import Path
37
+ from typing import Any, Dict, List, Optional
38
+
39
+ try:
40
+ from google import genai
41
+ from google.genai import types
42
+ except ImportError:
43
+ print("Error: google-genai package not installed.")
44
+ print("Install with: pip install google-genai")
45
+ sys.exit(1)
46
+
47
+ try:
48
+ import yaml
49
+
50
+ YAML_AVAILABLE = True
51
+ except ImportError:
52
+ YAML_AVAILABLE = False
53
+
54
+ try:
55
+ from dotenv import load_dotenv
56
+
57
+ load_dotenv()
58
+ except ImportError:
59
+ pass # dotenv is optional
60
+
61
+
62
+ # Fixed model - Nano Banana Pro
63
+ MODEL_NAME = "gemini-3-pro-image-preview"
64
+
65
+ # Supported configurations
66
+ SUPPORTED_ASPECT_RATIOS = ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"]
67
+ SUPPORTED_RESOLUTIONS = ["1K", "2K", "4K"]
68
+
69
+ # Retry configuration
70
+ MAX_RETRIES = 5
71
+ BASE_DELAY = 2.0
72
+ MAX_DELAY = 120.0
73
+
74
+
75
+ @dataclass
76
+ class ImageTask:
77
+ """Represents a single image generation task."""
78
+
79
+ prompt: str
80
+ output_path: str
81
+ aspect_ratio: str = "16:9"
82
+ resolution: str = "2K"
83
+ style: Optional[str] = None
84
+ enable_grounding: bool = False
85
+ task_id: int = 0
86
+ metadata: Dict[str, Any] = field(default_factory=dict)
87
+
88
+
89
+ @dataclass
90
+ class BatchResult:
91
+ """Represents results of a batch generation."""
92
+
93
+ total: int = 0
94
+ successful: int = 0
95
+ failed: int = 0
96
+ results: List[Dict[str, Any]] = field(default_factory=list)
97
+ errors: List[Dict[str, Any]] = field(default_factory=list)
98
+ start_time: Optional[datetime] = None
99
+ end_time: Optional[datetime] = None
100
+ total_duration_seconds: float = 0.0
101
+
102
+
103
+ def get_api_key() -> str:
104
+ """Get API key from environment variable."""
105
+ api_key = os.getenv("GOOGLE_API_KEY")
106
+ if not api_key:
107
+ print("Error: GOOGLE_API_KEY environment variable not set.")
108
+ print("Set up your API key:")
109
+ print(" 1. Get your key from https://aistudio.google.com/apikey")
110
+ print(" 2. Create .env file with: GOOGLE_API_KEY=your_key_here")
111
+ print(" 3. Or set environment variable: export GOOGLE_API_KEY=your_key_here")
112
+ sys.exit(1)
113
+ return api_key
114
+
115
+
116
+ def validate_aspect_ratio(ratio: str) -> str:
117
+ """Validate and normalize aspect ratio."""
118
+ if ratio not in SUPPORTED_ASPECT_RATIOS:
119
+ return "16:9"
120
+ return ratio
121
+
122
+
123
+ def validate_resolution(resolution: str) -> str:
124
+ """Validate and normalize resolution."""
125
+ normalized = resolution.upper()
126
+ if normalized not in SUPPORTED_RESOLUTIONS:
127
+ return "2K"
128
+ return normalized
129
+
130
+
131
+ def build_prompt_with_style(prompt: str, style: Optional[str] = None) -> str:
132
+ """Build final prompt with optional style prefix."""
133
+ if style:
134
+ return f"{style}: {prompt}"
135
+ return prompt
136
+
137
+
138
+ def calculate_backoff_delay(attempt: int, jitter: bool = True) -> float:
139
+ """Calculate exponential backoff delay with optional jitter."""
140
+ delay = min(BASE_DELAY * (2**attempt), MAX_DELAY)
141
+ if jitter:
142
+ delay = delay * (0.5 + random.random())
143
+ return delay
144
+
145
+
146
+ def load_config_file(config_path: str) -> Dict[str, Any]:
147
+ """Load batch configuration from JSON or YAML file."""
148
+ path = Path(config_path)
149
+
150
+ if not path.exists():
151
+ raise FileNotFoundError(f"Config file not found: {config_path}")
152
+
153
+ content = path.read_text(encoding="utf-8")
154
+
155
+ if path.suffix.lower() in [".yaml", ".yml"]:
156
+ if not YAML_AVAILABLE:
157
+ raise ImportError("PyYAML not installed. Install with: pip install pyyaml")
158
+ return yaml.safe_load(content)
159
+ else:
160
+ return json.loads(content)
161
+
162
+
163
+ def parse_tasks_from_config(config: Dict[str, Any], output_dir: str) -> List[ImageTask]:
164
+ """Parse image tasks from configuration dictionary."""
165
+ tasks = []
166
+
167
+ # Global defaults
168
+ defaults = config.get("defaults", {})
169
+ global_style = defaults.get("style")
170
+ global_resolution = defaults.get("resolution", "2K")
171
+ global_aspect_ratio = defaults.get("aspect_ratio", "16:9")
172
+ global_grounding = defaults.get("enable_grounding", False)
173
+
174
+ # Parse items
175
+ items = config.get("images", config.get("prompts", []))
176
+
177
+ for idx, item in enumerate(items):
178
+ if isinstance(item, str):
179
+ # Simple string prompt
180
+ prompt = item
181
+ filename = f"image_{idx + 1:03d}.png"
182
+ task = ImageTask(
183
+ prompt=prompt,
184
+ output_path=str(Path(output_dir) / filename),
185
+ aspect_ratio=validate_aspect_ratio(global_aspect_ratio),
186
+ resolution=validate_resolution(global_resolution),
187
+ style=global_style,
188
+ enable_grounding=global_grounding,
189
+ task_id=idx + 1,
190
+ )
191
+ else:
192
+ # Dictionary with full configuration
193
+ prompt = item.get("prompt", item.get("description", ""))
194
+ filename = item.get("filename", item.get("output", f"image_{idx + 1:03d}.png"))
195
+
196
+ # Ensure .png extension
197
+ if not filename.lower().endswith(".png"):
198
+ filename += ".png"
199
+
200
+ task = ImageTask(
201
+ prompt=prompt,
202
+ output_path=str(Path(output_dir) / filename),
203
+ aspect_ratio=validate_aspect_ratio(item.get("aspect_ratio", global_aspect_ratio)),
204
+ resolution=validate_resolution(item.get("resolution", global_resolution)),
205
+ style=item.get("style", global_style),
206
+ enable_grounding=item.get("enable_grounding", global_grounding),
207
+ task_id=idx + 1,
208
+ metadata=item.get("metadata", {}),
209
+ )
210
+
211
+ if task.prompt:
212
+ tasks.append(task)
213
+
214
+ return tasks
215
+
216
+
217
+ def create_tasks_from_prompts(
218
+ prompts: List[str], output_dir: str, style: Optional[str] = None, resolution: str = "2K", aspect_ratio: str = "16:9"
219
+ ) -> List[ImageTask]:
220
+ """Create tasks from command-line prompts."""
221
+ tasks = []
222
+
223
+ for idx, prompt in enumerate(prompts):
224
+ filename = f"image_{idx + 1:03d}.png"
225
+ task = ImageTask(
226
+ prompt=prompt,
227
+ output_path=str(Path(output_dir) / filename),
228
+ aspect_ratio=validate_aspect_ratio(aspect_ratio),
229
+ resolution=validate_resolution(resolution),
230
+ style=style,
231
+ task_id=idx + 1,
232
+ )
233
+ tasks.append(task)
234
+
235
+ return tasks
236
+
237
+
238
+ async def generate_single_image(
239
+ client: genai.Client, task: ImageTask, max_retries: int = MAX_RETRIES, verbose: bool = False
240
+ ) -> Dict[str, Any]:
241
+ """Generate a single image with retry logic."""
242
+ final_prompt = build_prompt_with_style(task.prompt, task.style)
243
+
244
+ # Build configuration
245
+ config_params = {
246
+ "response_modalities": ["TEXT", "IMAGE"],
247
+ "image_config": types.ImageConfig(aspect_ratio=task.aspect_ratio, image_size=task.resolution),
248
+ }
249
+
250
+ if task.enable_grounding:
251
+ config_params["tools"] = [{"google_search": {}}]
252
+
253
+ config = types.GenerateContentConfig(**config_params)
254
+
255
+ last_error = None
256
+ for attempt in range(max_retries):
257
+ try:
258
+ if verbose:
259
+ print(f" [{task.task_id}] Attempt {attempt + 1}/{max_retries}...")
260
+
261
+ start_time = time.time()
262
+
263
+ # Generate image (sync call in async context)
264
+ response = await asyncio.get_event_loop().run_in_executor(
265
+ None, lambda: client.models.generate_content(model=MODEL_NAME, contents=final_prompt, config=config)
266
+ )
267
+
268
+ generation_time = time.time() - start_time
269
+
270
+ # Ensure output directory exists
271
+ output_dir = Path(task.output_path).parent
272
+ if output_dir and str(output_dir) != "." and not output_dir.exists():
273
+ output_dir.mkdir(parents=True, exist_ok=True)
274
+
275
+ # Save image
276
+ image_saved = False
277
+
278
+ for part in response.candidates[0].content.parts:
279
+ if part.inline_data is not None:
280
+ with open(task.output_path, "wb") as f:
281
+ f.write(part.inline_data.data)
282
+ image_saved = True
283
+ elif hasattr(part, "text") and part.text:
284
+ _ = part.text # Text response captured but not used for image generation
285
+
286
+ if not image_saved:
287
+ raise RuntimeError("No image data in response")
288
+
289
+ return {
290
+ "success": True,
291
+ "task_id": task.task_id,
292
+ "prompt": task.prompt,
293
+ "output_path": str(Path(task.output_path).absolute()),
294
+ "generation_time_seconds": round(generation_time, 2),
295
+ "attempts": attempt + 1,
296
+ "metadata": task.metadata,
297
+ }
298
+
299
+ except Exception as e:
300
+ last_error = e
301
+ error_str = str(e).lower()
302
+
303
+ # Non-retryable errors
304
+ if "permission" in error_str or "api_key" in error_str:
305
+ break
306
+ if "invalid" in error_str and "argument" in error_str:
307
+ break
308
+
309
+ # Retryable errors with exponential backoff
310
+ if attempt < max_retries - 1:
311
+ is_quota_error = any(
312
+ kw in error_str for kw in ["quota", "rate", "429", "resource_exhausted", "too_many"]
313
+ )
314
+ delay = calculate_backoff_delay(attempt, jitter=is_quota_error)
315
+
316
+ if verbose:
317
+ if is_quota_error:
318
+ print(f" [{task.task_id}] Rate limit. Waiting {delay:.1f}s...")
319
+ else:
320
+ print(f" [{task.task_id}] Error: {e}. Retrying in {delay:.1f}s...")
321
+
322
+ await asyncio.sleep(delay)
323
+
324
+ return {
325
+ "success": False,
326
+ "task_id": task.task_id,
327
+ "prompt": task.prompt,
328
+ "error": str(last_error),
329
+ "attempts": max_retries,
330
+ "metadata": task.metadata,
331
+ }
332
+
333
+
334
+ async def run_batch_generation(
335
+ tasks: List[ImageTask],
336
+ concurrency: int = 2,
337
+ max_retries: int = MAX_RETRIES,
338
+ verbose: bool = False,
339
+ delay_between_tasks: float = 1.0,
340
+ ) -> BatchResult:
341
+ """Run batch generation with concurrency control."""
342
+ result = BatchResult(total=len(tasks), start_time=datetime.now())
343
+
344
+ # Get API key and create client
345
+ api_key = get_api_key()
346
+ client = genai.Client(api_key=api_key)
347
+
348
+ # Semaphore for concurrency control
349
+ semaphore = asyncio.Semaphore(concurrency)
350
+
351
+ async def process_with_semaphore(task: ImageTask) -> Dict[str, Any]:
352
+ async with semaphore:
353
+ task_result = await generate_single_image(client, task, max_retries, verbose)
354
+ # Add delay between tasks to avoid rate limiting
355
+ await asyncio.sleep(delay_between_tasks)
356
+ return task_result
357
+
358
+ # Process all tasks
359
+ print(f"\nProcessing {len(tasks)} images with concurrency={concurrency}...")
360
+
361
+ task_results = await asyncio.gather(*[process_with_semaphore(task) for task in tasks], return_exceptions=True)
362
+
363
+ # Collect results
364
+ for idx, task_result in enumerate(task_results):
365
+ if isinstance(task_result, Exception):
366
+ result.failed += 1
367
+ result.errors.append(
368
+ {"task_id": tasks[idx].task_id, "prompt": tasks[idx].prompt, "error": str(task_result)}
369
+ )
370
+ elif task_result.get("success"):
371
+ result.successful += 1
372
+ result.results.append(task_result)
373
+ print(f" [OK] {Path(task_result['output_path']).name}")
374
+ else:
375
+ result.failed += 1
376
+ result.errors.append(task_result)
377
+ print(f" [FAIL] Task {task_result.get('task_id')}: {task_result.get('error', 'Unknown error')[:50]}")
378
+
379
+ result.end_time = datetime.now()
380
+ result.total_duration_seconds = (result.end_time - result.start_time).total_seconds()
381
+
382
+ return result
383
+
384
+
385
+ def save_batch_report(result: BatchResult, output_path: str) -> None:
386
+ """Save batch generation report to JSON file."""
387
+ report = {
388
+ "summary": {
389
+ "total": result.total,
390
+ "successful": result.successful,
391
+ "failed": result.failed,
392
+ "success_rate": f"{(result.successful / result.total * 100):.1f}%" if result.total > 0 else "0%",
393
+ "duration_seconds": round(result.total_duration_seconds, 2),
394
+ "start_time": result.start_time.isoformat() if result.start_time else None,
395
+ "end_time": result.end_time.isoformat() if result.end_time else None,
396
+ },
397
+ "results": result.results,
398
+ "errors": result.errors,
399
+ }
400
+
401
+ with open(output_path, "w", encoding="utf-8") as f:
402
+ json.dump(report, f, indent=2, ensure_ascii=False)
403
+
404
+
405
+ def main():
406
+ """Main entry point for CLI usage."""
407
+ parser = argparse.ArgumentParser(
408
+ description="Batch image generation using Nano Banana Pro (gemini-3-pro-image-preview)",
409
+ formatter_class=argparse.RawDescriptionHelpFormatter,
410
+ epilog="""
411
+ Examples:
412
+ # From config file
413
+ python batch_generate.py -c prompts.json -d output/
414
+ python batch_generate.py -c prompts.yaml -d output/ --concurrency 3
415
+
416
+ # From command line prompts
417
+ python batch_generate.py --prompts "A cat" "A dog" "A bird" -d output/
418
+ python batch_generate.py --prompts "Logo design" "Banner art" -d output/ \\
419
+ --style "minimalist, vector"
420
+
421
+ Config File Format (JSON):
422
+ {
423
+ "defaults": {
424
+ "style": "photorealistic",
425
+ "resolution": "4K",
426
+ "aspect_ratio": "16:9"
427
+ },
428
+ "images": [
429
+ "Simple prompt string",
430
+ {
431
+ "prompt": "Detailed prompt",
432
+ "filename": "custom_name.png",
433
+ "resolution": "2K",
434
+ "style": "watercolor"
435
+ }
436
+ ]
437
+ }
438
+
439
+ Config File Format (YAML):
440
+ defaults:
441
+ style: photorealistic
442
+ resolution: 4K
443
+ images:
444
+ - Simple prompt string
445
+ - prompt: Detailed prompt
446
+ filename: custom_name.png
447
+
448
+ Environment:
449
+ GOOGLE_API_KEY - Required. Get from https://aistudio.google.com/apikey
450
+ """,
451
+ )
452
+
453
+ # Input options (mutually exclusive)
454
+ input_group = parser.add_mutually_exclusive_group(required=True)
455
+ input_group.add_argument("-c", "--config", help="Path to JSON or YAML config file")
456
+ input_group.add_argument("--prompts", nargs="+", help="List of prompts to generate")
457
+
458
+ # Output options
459
+ parser.add_argument("-d", "--output-dir", required=True, help="Output directory for generated images")
460
+
461
+ # Generation options
462
+ parser.add_argument(
463
+ "-r", "--resolution", default="2K", choices=SUPPORTED_RESOLUTIONS, help="Default resolution (default: 2K)"
464
+ )
465
+
466
+ parser.add_argument(
467
+ "-a",
468
+ "--aspect-ratio",
469
+ default="16:9",
470
+ choices=SUPPORTED_ASPECT_RATIOS,
471
+ help="Default aspect ratio (default: 16:9)",
472
+ )
473
+
474
+ parser.add_argument("--style", help="Default style prefix for all prompts")
475
+
476
+ # Processing options
477
+ parser.add_argument("--concurrency", type=int, default=2, help="Number of concurrent generations (default: 2)")
478
+
479
+ parser.add_argument(
480
+ "--max-retries",
481
+ type=int,
482
+ default=MAX_RETRIES,
483
+ help=f"Maximum retry attempts per image (default: {MAX_RETRIES})",
484
+ )
485
+
486
+ parser.add_argument("--delay", type=float, default=1.0, help="Delay between tasks in seconds (default: 1.0)")
487
+
488
+ # Report options
489
+ parser.add_argument("--report", help="Path to save JSON report (optional)")
490
+
491
+ parser.add_argument("-v", "--verbose", action="store_true", help="Print detailed progress information")
492
+
493
+ args = parser.parse_args()
494
+
495
+ # Ensure output directory exists
496
+ output_dir = Path(args.output_dir)
497
+ output_dir.mkdir(parents=True, exist_ok=True)
498
+
499
+ # Load or create tasks
500
+ if args.config:
501
+ print(f"Loading config from: {args.config}")
502
+ config = load_config_file(args.config)
503
+ tasks = parse_tasks_from_config(config, str(output_dir))
504
+ else:
505
+ tasks = create_tasks_from_prompts(
506
+ args.prompts, str(output_dir), style=args.style, resolution=args.resolution, aspect_ratio=args.aspect_ratio
507
+ )
508
+
509
+ if not tasks:
510
+ print("Error: No valid tasks found.")
511
+ sys.exit(1)
512
+
513
+ print(f"Loaded {len(tasks)} image tasks")
514
+ print(f"Output directory: {output_dir.absolute()}")
515
+ print(f"Model: {MODEL_NAME}")
516
+
517
+ # Run batch generation
518
+ result = asyncio.run(
519
+ run_batch_generation(
520
+ tasks,
521
+ concurrency=args.concurrency,
522
+ max_retries=args.max_retries,
523
+ verbose=args.verbose,
524
+ delay_between_tasks=args.delay,
525
+ )
526
+ )
527
+
528
+ # Print summary
529
+ print(f"\n{'=' * 50}")
530
+ print("BATCH GENERATION COMPLETE")
531
+ print(f"{'=' * 50}")
532
+ print(f" Total: {result.total}")
533
+ print(f" Successful: {result.successful}")
534
+ print(f" Failed: {result.failed}")
535
+ print(f" Duration: {result.total_duration_seconds:.1f}s")
536
+
537
+ if result.total > 0:
538
+ print(f" Success Rate: {(result.successful / result.total * 100):.1f}%")
539
+
540
+ # Save report if requested
541
+ if args.report:
542
+ save_batch_report(result, args.report)
543
+ print(f"\nReport saved to: {args.report}")
544
+
545
+ # Exit with error if any failures
546
+ if result.failed > 0:
547
+ print(f"\nWarning: {result.failed} images failed to generate.")
548
+ if result.errors:
549
+ print("Failed tasks:")
550
+ for err in result.errors[:5]: # Show first 5 errors
551
+ print(f" - Task {err.get('task_id')}: {err.get('error', 'Unknown')[:60]}")
552
+ if len(result.errors) > 5:
553
+ print(f" ... and {len(result.errors) - 5} more errors")
554
+ sys.exit(1)
555
+
556
+ print("\nAll images generated successfully!")
557
+
558
+
559
+ if __name__ == "__main__":
560
+ main()