moai-adk 0.25.4__py3-none-any.whl → 0.32.8__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 (378) hide show
  1. moai_adk/__init__.py +2 -5
  2. moai_adk/__main__.py +114 -82
  3. moai_adk/cli/__init__.py +6 -1
  4. moai_adk/cli/commands/__init__.py +1 -3
  5. moai_adk/cli/commands/analyze.py +5 -16
  6. moai_adk/cli/commands/doctor.py +6 -18
  7. moai_adk/cli/commands/init.py +56 -125
  8. moai_adk/cli/commands/language.py +14 -35
  9. moai_adk/cli/commands/status.py +9 -15
  10. moai_adk/cli/commands/update.py +1555 -190
  11. moai_adk/cli/prompts/init_prompts.py +112 -56
  12. moai_adk/cli/spec_status.py +263 -0
  13. moai_adk/cli/ui/__init__.py +44 -0
  14. moai_adk/cli/ui/progress.py +422 -0
  15. moai_adk/cli/ui/prompts.py +389 -0
  16. moai_adk/cli/ui/theme.py +129 -0
  17. moai_adk/cli/worktree/__init__.py +27 -0
  18. moai_adk/cli/worktree/__main__.py +31 -0
  19. moai_adk/cli/worktree/cli.py +672 -0
  20. moai_adk/cli/worktree/exceptions.py +89 -0
  21. moai_adk/cli/worktree/manager.py +490 -0
  22. moai_adk/cli/worktree/models.py +65 -0
  23. moai_adk/cli/worktree/registry.py +128 -0
  24. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  25. moai_adk/core/analysis/session_analyzer.py +17 -56
  26. moai_adk/core/claude_integration.py +26 -54
  27. moai_adk/core/command_helpers.py +10 -10
  28. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  29. moai_adk/core/config/auto_spec_config.py +5 -11
  30. moai_adk/core/config/migration.py +19 -9
  31. moai_adk/core/config/unified.py +436 -0
  32. moai_adk/core/context_manager.py +6 -12
  33. moai_adk/core/enterprise_features.py +1404 -0
  34. moai_adk/core/error_recovery_system.py +725 -112
  35. moai_adk/core/event_driven_hook_system.py +1371 -0
  36. moai_adk/core/git/__init__.py +8 -0
  37. moai_adk/core/git/branch_manager.py +3 -11
  38. moai_adk/core/git/checkpoint.py +1 -3
  39. moai_adk/core/git/conflict_detector.py +413 -0
  40. moai_adk/core/git/manager.py +91 -1
  41. moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
  42. moai_adk/core/input_validation_middleware.py +1006 -0
  43. moai_adk/core/integration/engine.py +6 -18
  44. moai_adk/core/integration/integration_tester.py +10 -9
  45. moai_adk/core/integration/utils.py +1 -1
  46. moai_adk/core/issue_creator.py +10 -28
  47. moai_adk/core/jit_context_loader.py +956 -0
  48. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  49. moai_adk/core/language_config_resolver.py +485 -0
  50. moai_adk/core/language_validator.py +28 -41
  51. moai_adk/core/mcp/setup.py +15 -12
  52. moai_adk/core/merge/__init__.py +9 -0
  53. moai_adk/core/merge/analyzer.py +481 -0
  54. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  55. moai_adk/core/migration/backup_manager.py +78 -9
  56. moai_adk/core/migration/custom_element_scanner.py +358 -0
  57. moai_adk/core/migration/file_migrator.py +8 -17
  58. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  59. moai_adk/core/migration/selective_restorer.py +470 -0
  60. moai_adk/core/migration/template_utils.py +74 -0
  61. moai_adk/core/migration/user_selection_ui.py +338 -0
  62. moai_adk/core/migration/version_detector.py +6 -10
  63. moai_adk/core/migration/version_migrator.py +3 -3
  64. moai_adk/core/performance/cache_system.py +8 -10
  65. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  66. moai_adk/core/project/checker.py +2 -4
  67. moai_adk/core/project/detector.py +1 -3
  68. moai_adk/core/project/initializer.py +135 -23
  69. moai_adk/core/project/phase_executor.py +54 -81
  70. moai_adk/core/project/validator.py +6 -12
  71. moai_adk/core/quality/trust_checker.py +9 -27
  72. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  73. moai_adk/core/robust_json_parser.py +611 -0
  74. moai_adk/core/rollback_manager.py +73 -148
  75. moai_adk/core/session_manager.py +10 -26
  76. moai_adk/core/skill_loading_system.py +579 -0
  77. moai_adk/core/spec/confidence_scoring.py +31 -100
  78. moai_adk/core/spec/ears_template_engine.py +351 -286
  79. moai_adk/core/spec/quality_validator.py +35 -69
  80. moai_adk/core/spec_status_manager.py +64 -74
  81. moai_adk/core/template/backup.py +45 -20
  82. moai_adk/core/template/config.py +112 -39
  83. moai_adk/core/template/merger.py +11 -19
  84. moai_adk/core/template/processor.py +253 -149
  85. moai_adk/core/template_engine.py +73 -40
  86. moai_adk/core/template_variable_synchronizer.py +417 -0
  87. moai_adk/core/unified_permission_manager.py +745 -0
  88. moai_adk/core/user_behavior_analytics.py +851 -0
  89. moai_adk/core/version_sync.py +429 -0
  90. moai_adk/foundation/__init__.py +56 -0
  91. moai_adk/foundation/backend.py +1027 -0
  92. moai_adk/foundation/database.py +1115 -0
  93. moai_adk/foundation/devops.py +1585 -0
  94. moai_adk/foundation/ears.py +431 -0
  95. moai_adk/foundation/frontend.py +870 -0
  96. moai_adk/foundation/git/commit_templates.py +4 -12
  97. moai_adk/foundation/git.py +376 -0
  98. moai_adk/foundation/langs.py +484 -0
  99. moai_adk/foundation/ml_ops.py +1162 -0
  100. moai_adk/foundation/testing.py +1524 -0
  101. moai_adk/foundation/trust/trust_principles.py +23 -72
  102. moai_adk/foundation/trust/validation_checklist.py +57 -162
  103. moai_adk/project/__init__.py +0 -0
  104. moai_adk/project/configuration.py +1084 -0
  105. moai_adk/project/documentation.py +566 -0
  106. moai_adk/project/schema.py +447 -0
  107. moai_adk/statusline/alfred_detector.py +1 -3
  108. moai_adk/statusline/config.py +13 -4
  109. moai_adk/statusline/enhanced_output_style_detector.py +23 -15
  110. moai_adk/statusline/main.py +51 -15
  111. moai_adk/statusline/renderer.py +104 -48
  112. moai_adk/statusline/update_checker.py +3 -9
  113. moai_adk/statusline/version_reader.py +140 -46
  114. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
  115. moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
  116. moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
  117. moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
  118. moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
  119. moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
  120. moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
  121. moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
  122. moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
  123. moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
  124. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
  125. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
  126. moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
  127. moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
  128. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  129. moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
  130. moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
  131. moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
  132. moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
  133. moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
  134. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
  135. moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
  136. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
  137. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
  138. moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
  139. moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
  140. moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
  141. moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
  142. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  143. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  144. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  145. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  146. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  147. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  148. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  149. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  150. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  151. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  152. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  153. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  154. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  155. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  156. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  157. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  158. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  159. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  160. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
  161. moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
  162. moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
  163. moai_adk/templates/.claude/settings.json +172 -0
  164. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
  165. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  166. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  167. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  168. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  169. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  170. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
  171. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
  172. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  173. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  174. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  175. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  176. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
  177. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
  178. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  179. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  180. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  181. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  182. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  183. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  184. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  185. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
  186. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  187. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  188. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  189. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  190. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  191. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  192. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
  193. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  194. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  195. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  196. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  197. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  198. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  199. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  200. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  201. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  202. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  203. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  204. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  205. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  206. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  207. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
  208. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
  209. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  210. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
  211. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  212. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  213. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  214. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  215. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  216. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  217. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  218. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  219. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
  220. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  221. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  222. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  223. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  224. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  225. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  226. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  227. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  228. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  229. moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
  230. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
  231. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
  232. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
  233. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
  234. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
  235. moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
  236. moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
  237. moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
  238. moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
  239. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
  240. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  241. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  242. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  243. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  244. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
  245. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  246. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  247. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  248. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  249. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  250. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  251. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  252. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  253. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  254. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  255. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
  256. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  257. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  258. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  259. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  260. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  261. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  262. moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
  263. moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
  264. moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
  265. moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
  266. moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
  267. moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
  268. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
  269. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  270. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  271. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  272. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
  273. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  274. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  275. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  276. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  277. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  278. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
  279. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  280. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  281. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  282. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  283. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  284. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  285. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  286. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  287. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  288. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  289. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  290. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
  291. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  292. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  293. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  294. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
  295. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  296. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  297. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  298. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  299. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  300. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  301. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
  302. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  303. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  304. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  305. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  306. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
  307. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  308. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  309. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  310. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  311. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  312. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  313. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  314. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  315. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  316. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  317. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  318. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  319. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  320. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  321. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  322. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  323. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
  324. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  325. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  326. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  327. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  328. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  329. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  330. moai_adk/templates/.git-hooks/pre-commit +103 -41
  331. moai_adk/templates/.git-hooks/pre-push +116 -21
  332. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  333. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  334. moai_adk/templates/.gitignore +184 -44
  335. moai_adk/templates/.mcp.json +7 -9
  336. moai_adk/templates/.moai/cache/personalization.json +10 -0
  337. moai_adk/templates/.moai/config/config.yaml +344 -0
  338. moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
  339. moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
  340. moai_adk/templates/.moai/config/presets/team.yaml +33 -0
  341. moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
  342. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  343. moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
  344. moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
  345. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
  346. moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
  347. moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
  348. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  349. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  350. moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
  351. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  352. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  353. moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
  354. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  355. moai_adk/templates/CLAUDE.md +382 -501
  356. moai_adk/utils/__init__.py +24 -1
  357. moai_adk/utils/banner.py +7 -10
  358. moai_adk/utils/common.py +16 -30
  359. moai_adk/utils/link_validator.py +4 -12
  360. moai_adk/utils/safe_file_reader.py +2 -6
  361. moai_adk/utils/timeout.py +160 -0
  362. moai_adk/utils/toon_utils.py +256 -0
  363. moai_adk/version.py +22 -0
  364. moai_adk-0.32.8.dist-info/METADATA +2478 -0
  365. moai_adk-0.32.8.dist-info/RECORD +396 -0
  366. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
  367. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
  368. moai_adk/cli/commands/backup.py +0 -82
  369. moai_adk/cli/commands/improve_user_experience.py +0 -348
  370. moai_adk/cli/commands/migrate.py +0 -158
  371. moai_adk/cli/commands/validate_links.py +0 -118
  372. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
  373. moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
  374. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
  375. moai_adk/utils/user_experience.py +0 -531
  376. moai_adk-0.25.4.dist-info/METADATA +0 -2279
  377. moai_adk-0.25.4.dist-info/RECORD +0 -112
  378. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,431 @@
1
+ """
2
+ EARS (Event-Agent-Result-Scenario) Implementation.
3
+
4
+ Provides:
5
+ - EARSParser: Parse natural language requirements into EARS patterns
6
+ - EARSValidator: Validate EARS requirement completeness and clarity
7
+ - EARSAnalyzer: Analyze requirements and generate test cases
8
+
9
+ Reference: EARS methodology for structured requirement specification
10
+ """
11
+
12
+ import re
13
+ from dataclasses import dataclass, field
14
+ from enum import Enum
15
+ from typing import Any, Dict, List, Optional
16
+
17
+
18
+ class EARSPatternType(Enum):
19
+ """Enumeration of EARS pattern types."""
20
+
21
+ EVENT = "event"
22
+ AGENT = "agent"
23
+ SCENARIO = "scenario"
24
+ VALIDATION = "validation"
25
+ COMPLEX = "complex"
26
+ UNKNOWN = "unknown"
27
+
28
+
29
+ @dataclass
30
+ class EARSResult:
31
+ """Result of EARS parsing or analysis."""
32
+
33
+ pattern_type: str
34
+ trigger: Optional[str] = None
35
+ triggers: List[str] = field(default_factory=list)
36
+ event: Optional[str] = None
37
+ agent: Optional[str] = None
38
+ agents: List[str] = field(default_factory=list)
39
+ condition: Optional[str] = None
40
+ conditions: List[str] = field(default_factory=list)
41
+ result: Optional[str] = None
42
+ results: List[str] = field(default_factory=list)
43
+ scenario: Optional[str] = None
44
+ capability: Optional[str] = None # For agent patterns
45
+ action: Optional[str] = None # Alias for capability
46
+ priority: int = 5
47
+ is_valid: bool = True
48
+ errors: List[str] = field(default_factory=list)
49
+ missing_elements: List[str] = field(default_factory=list)
50
+
51
+ def __getitem__(self, key):
52
+ """Allow dict-like access for backward compatibility."""
53
+ if isinstance(key, str):
54
+ return getattr(self, key, None)
55
+ # Handle integer indexing - convert to attribute access
56
+ return None
57
+
58
+ def __contains__(self, key):
59
+ """Support 'in' operator for dict-like behavior."""
60
+ return hasattr(self, key) and getattr(self, key) is not None
61
+
62
+ def get(self, key, default=None):
63
+ """Allow dict.get() compatibility."""
64
+ return getattr(self, key, default)
65
+
66
+
67
+ class EARSParser:
68
+ """Parse natural language requirements into EARS patterns."""
69
+
70
+ # Regex patterns for EARS components
71
+ WHEN_PATTERN = re.compile(r"when\s+([^,\.]*?)(?:,|where|then|\.|$)", re.IGNORECASE)
72
+ AGENT_PATTERN = re.compile(r"as\s+(?:an?\s+)?([^,\n]+?)(?:,|\n|when|shall|i\s+shall|\.|$)", re.IGNORECASE)
73
+ WHERE_PATTERN = re.compile(r"where\s+([^,\.]*?)(?:,|then|$)", re.IGNORECASE)
74
+ THEN_PATTERN = re.compile(r"then\s+([^\.]*?)(?:\.|$)", re.IGNORECASE)
75
+ SCENARIO_PATTERN = re.compile(r"scenario\s*:\s*([^\n]+)", re.IGNORECASE)
76
+
77
+ def parse(self, requirement: str) -> EARSResult:
78
+ """
79
+ Parse requirement text into EARS components.
80
+
81
+ Args:
82
+ requirement: Natural language requirement text
83
+
84
+ Returns:
85
+ EARSResult: Parsed requirement with identified pattern and components
86
+ """
87
+ if not requirement or not requirement.strip():
88
+ return EARSResult(pattern_type="unknown")
89
+
90
+ requirement = requirement.strip()
91
+
92
+ # Try to identify pattern type
93
+ pattern_type = self._identify_pattern_type(requirement)
94
+
95
+ # Extract components based on pattern
96
+ result = EARSResult(pattern_type=pattern_type)
97
+
98
+ # Extract EARS components
99
+ self._extract_agents(requirement, result)
100
+ self._extract_triggers(requirement, result)
101
+ self._extract_conditions(requirement, result)
102
+ self._extract_results(requirement, result)
103
+ self._extract_scenario(requirement, result)
104
+
105
+ return result
106
+
107
+ def _identify_pattern_type(self, text: str) -> str:
108
+ """Identify which EARS pattern type the requirement follows."""
109
+ text_lower = text.lower()
110
+
111
+ # Check for scenario first (most specific)
112
+ if re.search(r"scenario\s*:", text_lower):
113
+ return EARSPatternType.SCENARIO.value
114
+
115
+ # Check for when...then (EVENT) - higher priority
116
+ has_when = re.search(r"when\s+[a-z]", text_lower)
117
+ has_then = re.search(r"then\s+[a-z]", text_lower)
118
+ if has_when and has_then:
119
+ return EARSPatternType.EVENT.value
120
+
121
+ # Check for where...then (VALIDATION)
122
+ has_where = re.search(r"where\s+[a-z]", text_lower)
123
+ if has_where and has_then:
124
+ return EARSPatternType.VALIDATION.value
125
+
126
+ # Check for as a...shall/can (AGENT)
127
+ has_agent = re.search(r"as\s+(?:an?\s+)?[a-z]", text_lower)
128
+ has_capability = re.search(r"shall|can|able|be able", text_lower)
129
+ if has_agent and has_capability and not has_when:
130
+ return EARSPatternType.AGENT.value
131
+
132
+ # Special case: as a + when + then = EVENT with agent
133
+ if has_agent and has_when and has_then:
134
+ return EARSPatternType.EVENT.value
135
+
136
+ return EARSPatternType.UNKNOWN.value
137
+
138
+ def _extract_agents(self, text: str, result: EARSResult) -> None:
139
+ """Extract agent/role information."""
140
+ matches = self.AGENT_PATTERN.findall(text)
141
+ if matches:
142
+ if len(matches) == 1:
143
+ result.agent = matches[0].strip()
144
+ else:
145
+ result.agents = [m.strip() for m in matches]
146
+ if matches:
147
+ result.agent = matches[0].strip()
148
+
149
+ # Extract capability/action for agent patterns
150
+ # Look for: shall <action>, can <action>, able to <action>
151
+ capability_pattern = re.compile(r"(?:shall|can|able to)\s+([^\.]*?)(?:\.|$)", re.IGNORECASE)
152
+ cap_matches = capability_pattern.findall(text)
153
+ if cap_matches:
154
+ # For agent patterns, treat first capability as the result and capability
155
+ capability = cap_matches[0].strip() if cap_matches else None
156
+ if capability:
157
+ result.result = capability
158
+ result.capability = capability
159
+ result.action = capability
160
+
161
+ def _extract_triggers(self, text: str, result: EARSResult) -> None:
162
+ """Extract trigger/event information."""
163
+ matches = self.WHEN_PATTERN.findall(text)
164
+ if matches:
165
+ triggers = [m.strip() for m in matches if m.strip()]
166
+ if triggers:
167
+ if len(triggers) == 1:
168
+ result.trigger = triggers[0]
169
+ else:
170
+ result.triggers = triggers
171
+ result.trigger = triggers[0]
172
+
173
+ def _extract_conditions(self, text: str, result: EARSResult) -> None:
174
+ """Extract condition information."""
175
+ matches = self.WHERE_PATTERN.findall(text)
176
+ if matches:
177
+ conditions = [m.strip() for m in matches if m.strip()]
178
+ if conditions:
179
+ if len(conditions) == 1:
180
+ result.condition = conditions[0]
181
+ else:
182
+ result.conditions = conditions
183
+ result.condition = conditions[0]
184
+
185
+ def _extract_results(self, text: str, result: EARSResult) -> None:
186
+ """Extract result/outcome information."""
187
+ matches = self.THEN_PATTERN.findall(text)
188
+ if matches:
189
+ results = [m.strip() for m in matches if m.strip()]
190
+ if results:
191
+ if len(results) == 1:
192
+ result.result = results[0]
193
+ else:
194
+ result.results = results
195
+ result.result = results[0]
196
+
197
+ def _extract_scenario(self, text: str, result: EARSResult) -> None:
198
+ """Extract scenario context if present."""
199
+ match = self.SCENARIO_PATTERN.search(text)
200
+ if match:
201
+ result.scenario = match.group(1).strip()
202
+
203
+
204
+ class EARSValidator:
205
+ """Validate EARS requirements for completeness and clarity."""
206
+
207
+ # Required elements for each pattern type
208
+ PATTERN_REQUIREMENTS = {
209
+ "event": ["trigger", "result"],
210
+ "agent": [
211
+ "agent",
212
+ "trigger",
213
+ "result",
214
+ ], # Agent patterns should have trigger (When does agent use capability?)
215
+ "scenario": ["scenario", "result"],
216
+ "validation": ["condition", "result"],
217
+ "complex": ["trigger", "condition", "result"],
218
+ }
219
+
220
+ # Keywords that indicate missing elements
221
+ WEAK_KEYWORDS = ["should", "maybe", "might", "could", "might"]
222
+
223
+ def validate(self, requirement: str) -> Dict[str, Any]:
224
+ """
225
+ Validate EARS requirement completeness.
226
+
227
+ Args:
228
+ requirement: Requirement text to validate
229
+
230
+ Returns:
231
+ Dict with validation results: {is_valid, errors, missing_elements, suggestions}
232
+ """
233
+ parser = EARSParser()
234
+ parsed = parser.parse(requirement)
235
+
236
+ errors = []
237
+ missing_elements = []
238
+ suggestions = []
239
+ is_valid = True
240
+
241
+ # Check if requirement is empty
242
+ if not requirement or not requirement.strip():
243
+ return {
244
+ "is_valid": False,
245
+ "errors": ["Requirement text is empty"],
246
+ "missing_elements": ["When", "Then"],
247
+ "suggestions": ["Provide a complete EARS requirement with When and Then clauses"],
248
+ }
249
+
250
+ # Check for required elements based on pattern type
251
+ pattern_type = parsed.pattern_type
252
+ req_lower = requirement.lower()
253
+
254
+ # Check for basic EARS keywords if pattern was identified
255
+ if pattern_type != "unknown":
256
+ required = self.PATTERN_REQUIREMENTS.get(pattern_type, [])
257
+ for element in required:
258
+ if not getattr(parsed, element, None):
259
+ # Use 'When' for 'trigger', 'Where' for 'condition', etc.
260
+ element_name = {
261
+ "trigger": "When",
262
+ "condition": "Where",
263
+ "result": "Then",
264
+ "agent": "Agent",
265
+ "scenario": "Scenario",
266
+ }.get(element, element.capitalize())
267
+ missing_elements.append(element_name)
268
+ is_valid = False
269
+ else:
270
+ # For unknown patterns, suggest missing keywords
271
+ if "when" not in req_lower and "as a" not in req_lower:
272
+ missing_elements.append("When")
273
+ is_valid = False
274
+ if "then" not in req_lower:
275
+ missing_elements.append("Then")
276
+ is_valid = False
277
+
278
+ # Check for vague language
279
+ for weak in self.WEAK_KEYWORDS:
280
+ if weak in req_lower:
281
+ errors.append(f"Weak keyword '{weak}' found - use 'shall' instead")
282
+ suggestions.append(f"Replace '{weak}' with 'shall'")
283
+ is_valid = False
284
+
285
+ # Check if pattern was identified
286
+ if pattern_type == "unknown":
287
+ errors.append("Could not identify EARS pattern (Event/Agent/Scenario/Validation)")
288
+ suggestions.append("Use clear EARS keywords: When, As a, Where, Then")
289
+ is_valid = False
290
+
291
+ # Suggest improvements
292
+ if not parsed.trigger and not parsed.agent:
293
+ suggestions.append("Add 'When...' (event) or 'As a...' (agent) clause")
294
+ if "When" not in missing_elements:
295
+ missing_elements.append("When")
296
+ if not parsed.result:
297
+ suggestions.append("Add 'Then...' clause describing expected result")
298
+
299
+ return {
300
+ "is_valid": is_valid,
301
+ "errors": errors,
302
+ "missing_elements": missing_elements,
303
+ "suggestions": suggestions,
304
+ }
305
+
306
+ def analyze(self, requirement: str) -> Dict[str, Any]:
307
+ """
308
+ Analyze requirement and extract metadata.
309
+
310
+ Args:
311
+ requirement: Requirement text
312
+
313
+ Returns:
314
+ Dict with analysis results including priority
315
+ """
316
+ validation = self.validate(requirement)
317
+ req_lower = requirement.lower()
318
+
319
+ # Assign priority based on requirement type
320
+ priority = 5 # Default
321
+
322
+ if any(word in req_lower for word in ["security", "authentication", "authorization", "encrypt"]):
323
+ priority = 8
324
+ elif any(word in req_lower for word in ["performance", "optimize", "fast"]):
325
+ priority = 6
326
+ elif any(word in req_lower for word in ["user experience", "ui", "tooltip", "hover"]):
327
+ priority = 4
328
+ elif any(word in req_lower for word in ["core", "critical", "essential"]):
329
+ priority = 9
330
+ elif any(word in req_lower for word in ["nice to have", "optional"]):
331
+ priority = 2
332
+
333
+ return {
334
+ "is_valid": validation["is_valid"],
335
+ "priority": priority,
336
+ "errors": validation["errors"],
337
+ "suggestions": validation["suggestions"],
338
+ }
339
+
340
+
341
+ class EARSAnalyzer:
342
+ """Analyze EARS requirements and generate test cases."""
343
+
344
+ def generate_test_cases(self, requirement: str) -> List[Dict[str, str]]:
345
+ """
346
+ Generate test cases from EARS requirement.
347
+
348
+ Args:
349
+ requirement: EARS requirement text
350
+
351
+ Returns:
352
+ List of test case dictionaries with given/when/then structure
353
+ """
354
+ parser = EARSParser()
355
+ parsed = parser.parse(requirement)
356
+
357
+ test_cases = []
358
+
359
+ # Happy path test
360
+ if parsed.trigger and parsed.result:
361
+ happy_test = {
362
+ "name": "Happy Path",
363
+ "given": f"A requirement with trigger: {parsed.trigger[:50]}",
364
+ "when": parsed.trigger[:100] if parsed.trigger else "trigger occurs",
365
+ "then": parsed.result[:100] if parsed.result else "result occurs",
366
+ }
367
+ test_cases.append(happy_test)
368
+
369
+ # Condition-based test cases
370
+ if parsed.condition:
371
+ valid_condition = {
372
+ "name": "Valid Condition Test",
373
+ "given": f"Condition is met: {parsed.condition[:50]}",
374
+ "when": parsed.trigger[:100] if parsed.trigger else "trigger occurs",
375
+ "then": f"System {parsed.result[:80] if parsed.result else 'responds appropriately'}",
376
+ }
377
+ test_cases.append(valid_condition)
378
+
379
+ # Also create inverse condition test
380
+ invalid_condition = {
381
+ "name": "Invalid Condition Test",
382
+ "given": f"Condition is NOT met: {parsed.condition[:50]}",
383
+ "when": parsed.trigger[:100] if parsed.trigger else "trigger occurs",
384
+ "then": "System handles error appropriately",
385
+ }
386
+ test_cases.append(invalid_condition)
387
+
388
+ # If no test cases were generated, create a basic one
389
+ if not test_cases:
390
+ basic_test = {
391
+ "name": "Basic Test",
392
+ "given": "Requirement is triggered",
393
+ "when": parsed.trigger or "event occurs",
394
+ "then": parsed.result or "expected behavior occurs",
395
+ }
396
+ test_cases.append(basic_test)
397
+
398
+ return test_cases
399
+
400
+ def analyze(self, requirement: str) -> Dict[str, Any]:
401
+ """
402
+ Complete analysis of EARS requirement.
403
+
404
+ Args:
405
+ requirement: Requirement text
406
+
407
+ Returns:
408
+ Dict with comprehensive analysis
409
+ """
410
+ parser = EARSParser()
411
+ validator = EARSValidator()
412
+
413
+ parsed = parser.parse(requirement)
414
+ validation = validator.analyze(requirement)
415
+ test_cases = self.generate_test_cases(requirement)
416
+
417
+ return {
418
+ "parsed": {
419
+ "pattern_type": parsed.pattern_type,
420
+ "agent": parsed.agent,
421
+ "trigger": parsed.trigger,
422
+ "condition": parsed.condition,
423
+ "result": parsed.result,
424
+ },
425
+ "priority": validation["priority"],
426
+ "is_valid": validation["is_valid"],
427
+ "errors": validation["errors"],
428
+ "suggestions": validation["suggestions"],
429
+ "test_cases": test_cases,
430
+ "test_count": len(test_cases),
431
+ }