moai-adk 0.15.1__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 (699) hide show
  1. moai_adk/__init__.py +2 -6
  2. moai_adk/__main__.py +136 -21
  3. moai_adk/cli/__init__.py +6 -2
  4. moai_adk/cli/commands/__init__.py +1 -4
  5. moai_adk/cli/commands/analyze.py +116 -0
  6. moai_adk/cli/commands/doctor.py +17 -5
  7. moai_adk/cli/commands/init.py +105 -47
  8. moai_adk/cli/commands/language.py +248 -0
  9. moai_adk/cli/commands/status.py +8 -13
  10. moai_adk/cli/commands/update.py +1734 -65
  11. moai_adk/cli/main.py +3 -2
  12. moai_adk/cli/prompts/init_prompts.py +144 -91
  13. moai_adk/cli/spec_status.py +263 -0
  14. moai_adk/cli/ui/__init__.py +44 -0
  15. moai_adk/cli/ui/progress.py +422 -0
  16. moai_adk/cli/ui/prompts.py +389 -0
  17. moai_adk/cli/ui/theme.py +129 -0
  18. moai_adk/cli/worktree/__init__.py +27 -0
  19. moai_adk/cli/worktree/__main__.py +31 -0
  20. moai_adk/cli/worktree/cli.py +672 -0
  21. moai_adk/cli/worktree/exceptions.py +89 -0
  22. moai_adk/cli/worktree/manager.py +490 -0
  23. moai_adk/cli/worktree/models.py +65 -0
  24. moai_adk/cli/worktree/registry.py +128 -0
  25. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  26. moai_adk/core/__init__.py +0 -1
  27. moai_adk/core/analysis/__init__.py +9 -0
  28. moai_adk/core/analysis/session_analyzer.py +400 -0
  29. moai_adk/core/claude_integration.py +393 -0
  30. moai_adk/core/command_helpers.py +270 -0
  31. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  32. moai_adk/core/config/__init__.py +6 -0
  33. moai_adk/core/config/auto_spec_config.py +340 -0
  34. moai_adk/core/config/migration.py +147 -16
  35. moai_adk/core/config/unified.py +436 -0
  36. moai_adk/core/context_manager.py +273 -0
  37. moai_adk/core/diagnostics/slash_commands.py +0 -1
  38. moai_adk/core/enterprise_features.py +1404 -0
  39. moai_adk/core/error_recovery_system.py +1902 -0
  40. moai_adk/core/event_driven_hook_system.py +1371 -0
  41. moai_adk/core/git/__init__.py +8 -1
  42. moai_adk/core/git/branch.py +0 -1
  43. moai_adk/core/git/branch_manager.py +2 -10
  44. moai_adk/core/git/checkpoint.py +1 -7
  45. moai_adk/core/git/commit.py +0 -1
  46. moai_adk/core/git/conflict_detector.py +413 -0
  47. moai_adk/core/git/event_detector.py +3 -5
  48. moai_adk/core/git/manager.py +91 -2
  49. moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
  50. moai_adk/core/input_validation_middleware.py +1006 -0
  51. moai_adk/core/integration/__init__.py +22 -0
  52. moai_adk/core/integration/engine.py +157 -0
  53. moai_adk/core/integration/integration_tester.py +226 -0
  54. moai_adk/core/integration/models.py +88 -0
  55. moai_adk/core/integration/utils.py +211 -0
  56. moai_adk/core/issue_creator.py +20 -28
  57. moai_adk/core/jit_context_loader.py +956 -0
  58. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  59. moai_adk/core/language_config.py +202 -0
  60. moai_adk/core/language_config_resolver.py +485 -0
  61. moai_adk/core/language_validator.py +543 -0
  62. moai_adk/core/mcp/setup.py +116 -0
  63. moai_adk/core/merge/__init__.py +9 -0
  64. moai_adk/core/merge/analyzer.py +481 -0
  65. moai_adk/core/migration/__init__.py +18 -0
  66. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  67. moai_adk/core/migration/backup_manager.py +277 -0
  68. moai_adk/core/migration/custom_element_scanner.py +358 -0
  69. moai_adk/core/migration/file_migrator.py +209 -0
  70. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  71. moai_adk/core/migration/selective_restorer.py +470 -0
  72. moai_adk/core/migration/template_utils.py +74 -0
  73. moai_adk/core/migration/user_selection_ui.py +338 -0
  74. moai_adk/core/migration/version_detector.py +139 -0
  75. moai_adk/core/migration/version_migrator.py +228 -0
  76. moai_adk/core/performance/__init__.py +6 -0
  77. moai_adk/core/performance/cache_system.py +316 -0
  78. moai_adk/core/performance/parallel_processor.py +116 -0
  79. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  80. moai_adk/core/project/__init__.py +0 -1
  81. moai_adk/core/project/backup_utils.py +2 -7
  82. moai_adk/core/project/checker.py +2 -4
  83. moai_adk/core/project/detector.py +17 -39
  84. moai_adk/core/project/initializer.py +170 -33
  85. moai_adk/core/project/phase_executor.py +398 -68
  86. moai_adk/core/project/validator.py +7 -32
  87. moai_adk/core/quality/__init__.py +1 -1
  88. moai_adk/core/quality/trust_checker.py +37 -101
  89. moai_adk/core/quality/validators/__init__.py +1 -1
  90. moai_adk/core/quality/validators/base_validator.py +1 -1
  91. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  92. moai_adk/core/robust_json_parser.py +611 -0
  93. moai_adk/core/rollback_manager.py +918 -0
  94. moai_adk/core/session_manager.py +651 -0
  95. moai_adk/core/skill_loading_system.py +579 -0
  96. moai_adk/core/spec/confidence_scoring.py +680 -0
  97. moai_adk/core/spec/ears_template_engine.py +1247 -0
  98. moai_adk/core/spec/quality_validator.py +687 -0
  99. moai_adk/core/spec_status_manager.py +478 -0
  100. moai_adk/core/template/__init__.py +0 -1
  101. moai_adk/core/template/backup.py +82 -17
  102. moai_adk/core/template/config.py +112 -40
  103. moai_adk/core/template/languages.py +0 -1
  104. moai_adk/core/template/merger.py +75 -26
  105. moai_adk/core/template/processor.py +750 -72
  106. moai_adk/core/template_engine.py +90 -48
  107. moai_adk/core/template_variable_synchronizer.py +417 -0
  108. moai_adk/core/unified_permission_manager.py +745 -0
  109. moai_adk/core/user_behavior_analytics.py +851 -0
  110. moai_adk/core/version_sync.py +429 -0
  111. moai_adk/foundation/__init__.py +56 -0
  112. moai_adk/foundation/backend.py +1027 -0
  113. moai_adk/foundation/database.py +1115 -0
  114. moai_adk/foundation/devops.py +1585 -0
  115. moai_adk/foundation/ears.py +431 -0
  116. moai_adk/foundation/frontend.py +870 -0
  117. moai_adk/foundation/git/commit_templates.py +557 -0
  118. moai_adk/foundation/git.py +376 -0
  119. moai_adk/foundation/langs.py +484 -0
  120. moai_adk/foundation/ml_ops.py +1162 -0
  121. moai_adk/foundation/testing.py +1524 -0
  122. moai_adk/foundation/trust/trust_principles.py +676 -0
  123. moai_adk/foundation/trust/validation_checklist.py +1573 -0
  124. moai_adk/project/__init__.py +0 -0
  125. moai_adk/project/configuration.py +1084 -0
  126. moai_adk/project/documentation.py +566 -0
  127. moai_adk/project/schema.py +447 -0
  128. moai_adk/statusline/__init__.py +38 -0
  129. moai_adk/statusline/alfred_detector.py +105 -0
  130. moai_adk/statusline/config.py +373 -0
  131. moai_adk/statusline/enhanced_output_style_detector.py +372 -0
  132. moai_adk/statusline/git_collector.py +190 -0
  133. moai_adk/statusline/main.py +264 -0
  134. moai_adk/statusline/metrics_tracker.py +78 -0
  135. moai_adk/statusline/renderer.py +383 -0
  136. moai_adk/statusline/update_checker.py +129 -0
  137. moai_adk/statusline/version_reader.py +741 -0
  138. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
  139. moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
  140. moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
  141. moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
  142. moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
  143. moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
  144. moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
  145. moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
  146. moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
  147. moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
  148. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
  149. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
  150. moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
  151. moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
  152. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  153. moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
  154. moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
  155. moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
  156. moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
  157. moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
  158. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
  159. moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
  160. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
  161. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
  162. moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
  163. moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
  164. moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
  165. moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
  166. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  167. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  168. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  169. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  170. moai_adk/templates/.claude/hooks/{alfred/shared/core → moai/lib}/checkpoint.py +9 -36
  171. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  172. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  173. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  174. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  175. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  176. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  177. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  178. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  179. moai_adk/templates/.claude/hooks/{alfred/shared/core → moai/lib}/project.py +63 -44
  180. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  181. moai_adk/templates/.claude/hooks/{alfred/core → moai/lib}/timeout.py +40 -16
  182. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  183. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  184. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
  185. moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
  186. moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
  187. moai_adk/templates/.claude/settings.json +78 -50
  188. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
  189. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  190. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  191. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  192. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  193. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  194. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +312 -283
  195. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +291 -94
  196. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  197. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  198. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  199. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  200. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +469 -101
  201. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
  202. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  203. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  204. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  205. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  206. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  207. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  208. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  209. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
  210. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  211. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  212. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  213. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  214. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  215. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  216. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
  217. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  218. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  219. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  220. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  221. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  222. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  223. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  224. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  225. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  226. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  227. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  228. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  229. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  230. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  231. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
  232. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
  233. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  234. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
  235. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  236. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  237. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  238. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  239. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  240. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  241. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  242. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  243. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
  244. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  245. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  246. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  247. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  248. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  249. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  250. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  251. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  252. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  253. moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
  254. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
  255. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
  256. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
  257. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
  258. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
  259. moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
  260. moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
  261. moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
  262. moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
  263. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
  264. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  265. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  266. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  267. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  268. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
  269. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  270. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  271. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  272. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  273. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  274. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  275. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  276. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  277. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  278. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  279. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
  280. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  281. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  282. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  283. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  284. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  285. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  286. moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
  287. moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
  288. moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
  289. moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
  290. moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
  291. moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
  292. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
  293. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  294. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  295. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  296. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
  297. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  298. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  299. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  300. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  301. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  302. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
  303. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  304. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  305. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  306. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  307. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  308. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  309. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  310. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  311. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  312. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  313. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  314. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
  315. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  316. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  317. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  318. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
  319. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  320. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  321. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  322. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  323. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  324. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  325. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
  326. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  327. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  328. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  329. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  330. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
  331. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  332. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  333. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  334. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  335. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  336. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  337. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  338. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  339. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  340. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  341. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  342. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  343. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  344. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  345. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  346. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  347. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
  348. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  349. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  350. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  351. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  352. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  353. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  354. moai_adk/templates/.git-hooks/pre-commit +128 -0
  355. moai_adk/templates/.git-hooks/pre-push +220 -13
  356. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  357. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  358. moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
  359. moai_adk/templates/.gitignore +197 -13
  360. moai_adk/templates/.mcp.json +20 -0
  361. moai_adk/templates/.moai/cache/personalization.json +10 -0
  362. moai_adk/templates/.moai/config/config.yaml +344 -0
  363. moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
  364. moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
  365. moai_adk/templates/.moai/config/presets/team.yaml +33 -0
  366. moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
  367. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  368. moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
  369. moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
  370. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
  371. moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
  372. moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
  373. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  374. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  375. moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
  376. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  377. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  378. moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
  379. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  380. moai_adk/templates/CLAUDE.md +310 -1050
  381. moai_adk/utils/__init__.py +24 -2
  382. moai_adk/utils/banner.py +7 -11
  383. moai_adk/utils/common.py +294 -0
  384. moai_adk/utils/link_validator.py +241 -0
  385. moai_adk/utils/logger.py +4 -9
  386. moai_adk/utils/safe_file_reader.py +206 -0
  387. moai_adk/{templates/.claude/hooks/alfred/utils → utils}/timeout.py +8 -9
  388. moai_adk/utils/toon_utils.py +256 -0
  389. moai_adk/version.py +22 -0
  390. moai_adk-0.32.8.dist-info/METADATA +2478 -0
  391. moai_adk-0.32.8.dist-info/RECORD +396 -0
  392. {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
  393. {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
  394. moai_adk/cli/commands/backup.py +0 -80
  395. moai_adk/core/tags/__init__.py +0 -86
  396. moai_adk/core/tags/ci_validator.py +0 -463
  397. moai_adk/core/tags/cli.py +0 -283
  398. moai_adk/core/tags/generator.py +0 -109
  399. moai_adk/core/tags/inserter.py +0 -99
  400. moai_adk/core/tags/mapper.py +0 -126
  401. moai_adk/core/tags/parser.py +0 -76
  402. moai_adk/core/tags/pre_commit_validator.py +0 -393
  403. moai_adk/core/tags/reporter.py +0 -956
  404. moai_adk/core/tags/tags.py +0 -149
  405. moai_adk/core/tags/validator.py +0 -897
  406. moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
  407. moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
  408. moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
  409. moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
  410. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
  411. moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
  412. moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
  413. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
  414. moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
  415. moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
  416. moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
  417. moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
  418. moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
  419. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
  420. moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
  421. moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
  422. moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
  423. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
  424. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
  425. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
  426. moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
  427. moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
  428. moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
  429. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
  430. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
  431. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
  432. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
  433. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
  434. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
  435. moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
  436. moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
  437. moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
  438. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
  439. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
  440. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
  441. moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
  442. moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
  443. moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
  444. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
  445. moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
  446. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
  447. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
  448. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
  449. moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
  450. moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
  451. moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
  452. moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
  453. moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
  454. moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
  455. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
  456. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
  457. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
  458. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
  459. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
  460. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
  461. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
  462. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
  463. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
  464. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
  465. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
  466. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
  467. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
  468. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
  469. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
  470. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
  471. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
  472. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
  473. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
  474. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
  475. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
  476. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
  477. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
  478. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
  479. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
  480. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
  481. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
  482. moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
  483. moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
  484. moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
  485. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
  486. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
  487. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
  488. moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
  489. moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
  490. moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
  491. moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
  492. moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
  493. moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
  494. moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
  495. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
  496. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
  497. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
  498. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
  499. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
  500. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
  501. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
  502. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
  503. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
  504. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
  505. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
  506. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
  507. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
  508. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
  509. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
  510. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
  511. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
  512. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
  513. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
  514. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
  515. moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
  516. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
  517. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
  518. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
  519. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
  520. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
  521. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
  522. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
  523. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
  524. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
  525. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
  526. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
  527. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
  528. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
  529. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
  530. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
  531. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
  532. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
  533. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
  534. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
  535. moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
  536. moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
  537. moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
  538. moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
  539. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
  540. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
  541. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
  542. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
  543. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
  544. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
  545. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
  546. moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
  547. moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
  548. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
  549. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
  550. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
  551. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
  552. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
  553. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
  554. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
  555. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
  556. moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
  557. moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
  558. moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
  559. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
  560. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
  561. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
  562. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
  563. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
  564. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
  565. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
  566. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
  567. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
  568. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
  569. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
  570. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
  571. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
  572. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
  573. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
  574. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
  575. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
  576. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
  577. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
  578. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
  579. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
  580. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
  581. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
  582. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
  583. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
  584. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
  585. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
  586. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
  587. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
  588. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
  589. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
  590. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
  591. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
  592. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
  593. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
  594. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
  595. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
  596. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
  597. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
  598. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
  599. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
  600. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
  601. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
  602. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
  603. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
  604. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
  605. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
  606. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
  607. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
  608. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
  609. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
  610. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
  611. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
  612. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
  613. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
  614. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  615. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
  616. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
  617. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
  618. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
  619. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
  620. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
  621. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
  622. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
  623. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
  624. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
  625. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
  626. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
  627. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
  628. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
  629. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
  630. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
  631. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
  632. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
  633. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
  634. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
  635. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
  636. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
  637. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
  638. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
  639. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
  640. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
  641. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
  642. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
  643. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
  644. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
  645. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
  646. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
  647. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
  648. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
  649. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
  650. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
  651. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
  652. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
  653. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
  654. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
  655. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
  656. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
  657. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
  658. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
  659. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
  660. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
  661. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
  662. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
  663. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
  664. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
  665. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
  666. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
  667. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
  668. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
  669. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
  670. moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
  671. moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
  672. moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
  673. moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
  674. moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
  675. moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
  676. moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
  677. moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
  678. moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
  679. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -419
  680. moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
  681. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
  682. moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
  683. moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
  684. moai_adk/templates/.github/workflows/release.yml +0 -118
  685. moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
  686. moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
  687. moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
  688. moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
  689. moai_adk/templates/.github/workflows/tag-report.yml +0 -269
  690. moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
  691. moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
  692. moai_adk/templates/.moai/config.json +0 -115
  693. moai_adk/templates/workflows/go-tag-validation.yml +0 -30
  694. moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
  695. moai_adk/templates/workflows/python-tag-validation.yml +0 -42
  696. moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
  697. moai_adk-0.15.1.dist-info/METADATA +0 -3094
  698. moai_adk-0.15.1.dist-info/RECORD +0 -365
  699. {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1006 @@
1
+ """
2
+ Enhanced Input Validation Middleware for MoAI-ADK
3
+
4
+ Production-ready input validation and normalization system that addresses tool input
5
+ validation failures identified in Claude Code debug logs. Provides intelligent parameter
6
+ mapping, version compatibility, and real-time input correction.
7
+
8
+ Author: MoAI-ADK Core Team
9
+ Version: 1.0.0
10
+ """
11
+
12
+ import json
13
+ import logging
14
+ from dataclasses import dataclass, field
15
+ from enum import Enum
16
+ from typing import Any, Callable, Dict, List, Optional, Set, Tuple
17
+
18
+ # Configure logging
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class ValidationSeverity(Enum):
23
+ """Input validation severity levels"""
24
+
25
+ LOW = "low"
26
+ MEDIUM = "medium"
27
+ HIGH = "high"
28
+ CRITICAL = "critical"
29
+
30
+
31
+ class ToolCategory(Enum):
32
+ """Categories of tools with specific validation requirements"""
33
+
34
+ SEARCH = "search"
35
+ FILE_OPERATIONS = "file_operations"
36
+ TEXT_PROCESSING = "text_processing"
37
+ DATA_ANALYSIS = "data_analysis"
38
+ SYSTEM = "system"
39
+ GENERAL = "general"
40
+
41
+
42
+ @dataclass
43
+ class ValidationError:
44
+ """Individual validation error details"""
45
+
46
+ code: str
47
+ message: str
48
+ path: List[str]
49
+ severity: ValidationSeverity
50
+ auto_corrected: bool = False
51
+ original_value: Any = None
52
+ corrected_value: Any = None
53
+ suggestion: Optional[str] = None
54
+
55
+
56
+ @dataclass
57
+ class ValidationResult:
58
+ """Result of input validation and normalization"""
59
+
60
+ valid: bool
61
+ normalized_input: Dict[str, Any]
62
+ errors: List[ValidationError] = field(default_factory=list)
63
+ warnings: List[str] = field(default_factory=list)
64
+ transformations: List[str] = field(default_factory=list)
65
+ processing_time_ms: float = 0.0
66
+
67
+
68
+ @dataclass
69
+ class ToolParameter:
70
+ """Tool parameter definition for validation"""
71
+
72
+ name: str
73
+ param_type: str
74
+ required: bool = False
75
+ default_value: Any = None
76
+ aliases: List[str] = field(default_factory=list)
77
+ validation_function: Optional[Callable] = None
78
+ description: str = ""
79
+ deprecated_aliases: List[str] = field(default_factory=list)
80
+
81
+
82
+ class EnhancedInputValidationMiddleware:
83
+ """
84
+ Production-ready input validation middleware that addresses tool input validation
85
+ failures from Claude Code debug logs with intelligent parameter mapping and normalization.
86
+
87
+ Key Features:
88
+ - Smart parameter mapping for unrecognized keys
89
+ - Version compatibility support
90
+ - Real-time input normalization
91
+ - Comprehensive error tracking and correction
92
+ - Tool-specific validation rules
93
+ """
94
+
95
+ def __init__(self, enable_logging: bool = True, enable_caching: bool = True):
96
+ self.enable_logging = enable_logging
97
+ self.enable_caching = enable_caching
98
+
99
+ # Tool parameter definitions
100
+ self.tool_parameters = self._load_tool_parameter_definitions()
101
+
102
+ # Parameter mapping for compatibility
103
+ self.parameter_mappings = self._load_parameter_mappings()
104
+
105
+ # Validation cache
106
+ self.validation_cache: Optional[Dict[str, Any]] = {} if enable_caching else None
107
+
108
+ # Statistics
109
+ self.stats = {
110
+ "validations_performed": 0,
111
+ "auto_corrections": 0,
112
+ "errors_resolved": 0,
113
+ "transformations_applied": 0,
114
+ }
115
+
116
+ def _load_tool_parameter_definitions(self) -> Dict[str, List[ToolParameter]]:
117
+ """Load tool parameter definitions with compatibility information"""
118
+ return {
119
+ "Grep": [
120
+ ToolParameter(
121
+ name="pattern",
122
+ param_type="string",
123
+ required=True,
124
+ description="Regex pattern to search for",
125
+ aliases=["regex", "search_pattern"],
126
+ ),
127
+ ToolParameter(
128
+ name="output_mode",
129
+ param_type="string",
130
+ default_value="content",
131
+ description="Output format mode",
132
+ aliases=["mode", "format"],
133
+ validation_function=self._validate_grep_mode,
134
+ ),
135
+ ToolParameter(
136
+ name="head_limit",
137
+ param_type="integer",
138
+ description="Limit number of results",
139
+ default_value=None,
140
+ aliases=["limit", "max_results", "count", "head"],
141
+ deprecated_aliases=["max"],
142
+ ),
143
+ ToolParameter(
144
+ name="path",
145
+ param_type="string",
146
+ description="Path to search in",
147
+ aliases=["directory", "folder", "search_path", "root"],
148
+ ),
149
+ ToolParameter(
150
+ name="file_pattern",
151
+ param_type="string",
152
+ description="File pattern to match",
153
+ aliases=["glob", "pattern", "files", "file_glob"],
154
+ ),
155
+ ToolParameter(
156
+ name="case_sensitive",
157
+ param_type="boolean",
158
+ default_value=False,
159
+ description="Case sensitive search",
160
+ aliases=["case", "ignore_case", "sensitive"],
161
+ ),
162
+ ToolParameter(
163
+ name="context_lines",
164
+ param_type="integer",
165
+ default_value=0,
166
+ description="Number of context lines",
167
+ aliases=["context", "before_context", "after_context", "C"],
168
+ ),
169
+ ],
170
+ "Glob": [
171
+ ToolParameter(
172
+ name="pattern",
173
+ param_type="string",
174
+ required=True,
175
+ description="Glob pattern to match",
176
+ aliases=["glob", "file_pattern", "search_pattern"],
177
+ ),
178
+ ToolParameter(
179
+ name="path",
180
+ param_type="string",
181
+ description="Base path for glob",
182
+ aliases=["directory", "folder", "root", "base_path"],
183
+ ),
184
+ ToolParameter(
185
+ name="recursive",
186
+ param_type="boolean",
187
+ default_value=True,
188
+ description="Recursive directory search",
189
+ aliases=["recurse", "recursive_search"],
190
+ ),
191
+ ],
192
+ "Read": [
193
+ ToolParameter(
194
+ name="file_path",
195
+ param_type="string",
196
+ required=True,
197
+ description="Path to file to read",
198
+ aliases=["path", "filename", "file", "source"],
199
+ ),
200
+ ToolParameter(
201
+ name="offset",
202
+ param_type="integer",
203
+ default_value=0,
204
+ description="Starting line number",
205
+ aliases=["start", "start_line", "begin", "from"],
206
+ ),
207
+ ToolParameter(
208
+ name="limit",
209
+ param_type="integer",
210
+ description="Number of lines to read",
211
+ aliases=["count", "max_lines", "lines", "size"],
212
+ ),
213
+ ],
214
+ "Bash": [
215
+ ToolParameter(
216
+ name="command",
217
+ param_type="string",
218
+ required=True,
219
+ description="Command to execute",
220
+ aliases=["cmd", "execute", "run", "script"],
221
+ ),
222
+ ToolParameter(
223
+ name="timeout",
224
+ param_type="integer",
225
+ default_value=10000,
226
+ description="Timeout in milliseconds",
227
+ aliases=["timeout_ms", "max_time", "time_limit"],
228
+ ),
229
+ ToolParameter(
230
+ name="working_directory",
231
+ param_type="string",
232
+ description="Working directory for command",
233
+ aliases=["cwd", "work_dir", "directory", "folder"],
234
+ ),
235
+ ToolParameter(
236
+ name="environment",
237
+ param_type="dict",
238
+ description="Environment variables",
239
+ aliases=["env", "env_vars", "variables"],
240
+ ),
241
+ ],
242
+ "Task": [
243
+ ToolParameter(
244
+ name="subagent_type",
245
+ param_type="string",
246
+ required=True,
247
+ description="Type of subagent to use",
248
+ aliases=["agent_type", "type", "agent", "model"],
249
+ ),
250
+ ToolParameter(
251
+ name="prompt",
252
+ param_type="string",
253
+ required=True,
254
+ description="Prompt for the subagent",
255
+ aliases=["message", "input", "query", "instruction"],
256
+ ),
257
+ ToolParameter(
258
+ name="context",
259
+ param_type="dict",
260
+ description="Additional context",
261
+ aliases=["data", "variables", "params"],
262
+ ),
263
+ ToolParameter(
264
+ name="debug",
265
+ param_type="boolean",
266
+ default_value=False,
267
+ description="Enable debug mode",
268
+ aliases=["verbose", "debug_mode"],
269
+ ),
270
+ ],
271
+ "Write": [
272
+ ToolParameter(
273
+ name="file_path",
274
+ param_type="string",
275
+ required=True,
276
+ description="Path to file to write",
277
+ aliases=["path", "filename", "file", "destination"],
278
+ ),
279
+ ToolParameter(
280
+ name="content",
281
+ param_type="string",
282
+ required=True,
283
+ description="Content to write",
284
+ aliases=["data", "text", "body", "contents"],
285
+ ),
286
+ ToolParameter(
287
+ name="create_directories",
288
+ param_type="boolean",
289
+ default_value=False,
290
+ description="Create parent directories if needed",
291
+ aliases=["mkdir", "create_dirs", "make_dirs"],
292
+ ),
293
+ ToolParameter(
294
+ name="backup",
295
+ param_type="boolean",
296
+ default_value=False,
297
+ description="Create backup of existing file",
298
+ aliases=["backup_existing", "make_backup"],
299
+ ),
300
+ ],
301
+ "Edit": [
302
+ ToolParameter(
303
+ name="file_path",
304
+ param_type="string",
305
+ required=True,
306
+ description="Path to file to edit",
307
+ aliases=["path", "filename", "file"],
308
+ ),
309
+ ToolParameter(
310
+ name="old_string",
311
+ param_type="string",
312
+ required=True,
313
+ description="String to replace",
314
+ aliases=["search", "find", "from", "original"],
315
+ ),
316
+ ToolParameter(
317
+ name="new_string",
318
+ param_type="string",
319
+ required=True,
320
+ description="Replacement string",
321
+ aliases=["replace", "to", "replacement"],
322
+ ),
323
+ ToolParameter(
324
+ name="replace_all",
325
+ param_type="boolean",
326
+ default_value=False,
327
+ description="Replace all occurrences",
328
+ aliases=["global", "all", "replace_all_occurrences"],
329
+ ),
330
+ ],
331
+ }
332
+
333
+ def _load_parameter_mappings(self) -> Dict[str, str]:
334
+ """Load parameter mapping for compatibility with different versions"""
335
+ return {
336
+ # Grep tool mappings
337
+ "grep_head_limit": "head_limit",
338
+ "grep_limit": "head_limit",
339
+ "grep_max": "head_limit",
340
+ "grep_count": "head_limit",
341
+ "grep_head": "head_limit",
342
+ "max_results": "head_limit",
343
+ "result_limit": "head_limit",
344
+ "num_results": "head_limit",
345
+ # Output mode mappings
346
+ "grep_mode": "output_mode",
347
+ "grep_format": "output_mode",
348
+ "output_format": "output_mode",
349
+ "display_mode": "output_mode",
350
+ "show_mode": "output_mode",
351
+ # Path mappings
352
+ "search_path": "path",
353
+ "base_path": "path",
354
+ "root_dir": "path",
355
+ "target_dir": "path",
356
+ # Glob tool mappings
357
+ "glob_pattern": "pattern",
358
+ "file_glob": "pattern",
359
+ "search_pattern": "pattern",
360
+ "match_pattern": "pattern",
361
+ # Read tool mappings
362
+ "start_line": "offset",
363
+ "begin_line": "offset",
364
+ "from_line": "offset",
365
+ "max_lines": "limit",
366
+ "line_count": "limit",
367
+ # Bash tool mappings
368
+ "cmd": "command",
369
+ "execute": "command",
370
+ "run_command": "command",
371
+ "timeout_ms": "timeout",
372
+ "max_time": "timeout",
373
+ "time_limit": "timeout",
374
+ "work_dir": "working_directory",
375
+ "cwd": "working_directory",
376
+ # Task tool mappings
377
+ "agent_type": "subagent_type",
378
+ "message": "prompt",
379
+ "instruction": "prompt",
380
+ "query": "prompt",
381
+ # Write tool mappings
382
+ "filename": "file_path",
383
+ "destination": "file_path",
384
+ "data": "content",
385
+ "text": "content",
386
+ "body": "content",
387
+ "make_backup": "backup",
388
+ # Edit tool mappings
389
+ "search": "old_string",
390
+ "find": "old_string",
391
+ "from": "old_string",
392
+ "replace": "new_string",
393
+ "to": "new_string",
394
+ "global": "replace_all",
395
+ "all": "replace_all",
396
+ }
397
+
398
+ def _validate_grep_mode(self, mode: str) -> bool:
399
+ """Validate grep output mode"""
400
+ valid_modes = ["content", "files_with_matches", "count"]
401
+ return mode in valid_modes
402
+
403
+ def validate_and_normalize_input(self, tool_name: str, input_data: Dict[str, Any]) -> ValidationResult:
404
+ """
405
+ Validate and normalize tool input data.
406
+
407
+ This is the main method that addresses the tool input validation failures
408
+ from the debug logs (Lines 476-495).
409
+ """
410
+ import time
411
+
412
+ start_time = time.time()
413
+
414
+ self.stats["validations_performed"] += 1
415
+
416
+ result = ValidationResult(valid=True, normalized_input=input_data.copy())
417
+
418
+ try:
419
+ # Get tool parameters
420
+ tool_params = self.tool_parameters.get(tool_name, [])
421
+
422
+ if not tool_params:
423
+ # Unknown tool - perform basic validation only
424
+ result.warnings.append(f"Unknown tool: {tool_name}")
425
+ return result
426
+
427
+ # Step 1: Map unrecognized parameters
428
+ mapped_input, mapping_errors = self._map_parameters(tool_name, result.normalized_input)
429
+ result.normalized_input = mapped_input
430
+ result.errors.extend(mapping_errors)
431
+
432
+ # Step 2: Validate required parameters
433
+ required_errors = self._validate_required_parameters(tool_params, result.normalized_input)
434
+ result.errors.extend(required_errors)
435
+
436
+ # Step 3: Apply default values
437
+ self._apply_default_values(tool_params, result.normalized_input)
438
+
439
+ # Step 4: Validate parameter values and apply type conversions
440
+ value_errors = self._validate_parameter_values(tool_params, result.normalized_input)
441
+ result.errors.extend(value_errors)
442
+
443
+ # Apply type conversions from errors
444
+ for error in value_errors:
445
+ if error.code == "type_conversion" and error.auto_corrected and error.corrected_value is not None:
446
+ result.normalized_input[error.path[0]] = error.corrected_value
447
+
448
+ # Step 5: Normalize parameter formats
449
+ transformations = self._normalize_parameter_formats(tool_params, result.normalized_input)
450
+ result.transformations.extend(transformations)
451
+
452
+ # Step 6: Check for deprecated parameters
453
+ deprecated_warnings = self._check_deprecated_parameters(tool_params, result.normalized_input)
454
+ result.warnings.extend(deprecated_warnings)
455
+
456
+ # Update valid status
457
+ critical_errors = [e for e in result.errors if e.severity == ValidationSeverity.CRITICAL]
458
+ if critical_errors:
459
+ result.valid = False
460
+
461
+ # Update statistics
462
+ auto_corrected = len([e for e in result.errors if e.auto_corrected])
463
+ self.stats["auto_corrections"] += auto_corrected
464
+ if auto_corrected > 0:
465
+ self.stats["errors_resolved"] += auto_corrected
466
+
467
+ self.stats["transformations_applied"] += len(result.transformations)
468
+
469
+ if self.enable_logging and (result.errors or result.warnings or result.transformations):
470
+ logger.info(
471
+ f"Input validation for {tool_name}: "
472
+ f"valid={result.valid}, errors={len(result.errors)}, "
473
+ f"warnings={len(result.warnings)}, transformations={len(result.transformations)}"
474
+ )
475
+
476
+ except Exception as e:
477
+ result.valid = False
478
+ result.errors.append(
479
+ ValidationError(
480
+ code="validation_exception",
481
+ message=f"Validation error: {str(e)}",
482
+ path=[],
483
+ severity=ValidationSeverity.CRITICAL,
484
+ )
485
+ )
486
+
487
+ if self.enable_logging:
488
+ logger.error(f"Exception during input validation for {tool_name}: {e}")
489
+
490
+ result.processing_time_ms = (time.time() - start_time) * 1000
491
+
492
+ return result
493
+
494
+ def _map_parameters(
495
+ self,
496
+ tool_name: str,
497
+ input_data: Dict[str, Any],
498
+ ) -> Tuple[Dict[str, Any], List[ValidationError]]:
499
+ """Map and rename unrecognized parameters to their canonical forms"""
500
+ mapped_input = input_data.copy()
501
+ errors = []
502
+
503
+ # Get tool-specific parameters
504
+ tool_params = self.tool_parameters.get(tool_name, [])
505
+
506
+ # Create mapping of all valid parameter names and aliases
507
+ valid_names = set()
508
+ alias_mapping = {}
509
+
510
+ for param in tool_params:
511
+ valid_names.add(param.name)
512
+ for alias in param.aliases + param.deprecated_aliases:
513
+ alias_mapping[alias] = param.name
514
+
515
+ # Add global parameter mappings
516
+ global_mapping_prefix = f"{tool_name.lower()}_"
517
+ for global_key, canonical_key in self.parameter_mappings.items():
518
+ if global_key.startswith(global_mapping_prefix):
519
+ short_key = global_key[len(global_mapping_prefix) :]
520
+ alias_mapping[short_key] = canonical_key
521
+
522
+ # Check each input parameter
523
+ for param_name in list(mapped_input.keys()):
524
+ if param_name in valid_names:
525
+ # Parameter is already in canonical form
526
+ continue
527
+
528
+ if param_name in alias_mapping:
529
+ # Map to canonical name
530
+ canonical_name = alias_mapping[param_name]
531
+ original_value = mapped_input[param_name]
532
+
533
+ mapped_input[canonical_name] = original_value
534
+ del mapped_input[param_name]
535
+
536
+ errors.append(
537
+ ValidationError(
538
+ code="parameter_mapped",
539
+ message=f"Mapped parameter '{param_name}' to '{canonical_name}'",
540
+ path=[param_name],
541
+ severity=ValidationSeverity.LOW,
542
+ auto_corrected=True,
543
+ original_value=original_value,
544
+ corrected_value=original_value,
545
+ suggestion=f"Use '{canonical_name}' instead of '{param_name}'",
546
+ )
547
+ )
548
+
549
+ else:
550
+ # Unknown parameter - create error
551
+ original_value = mapped_input[param_name]
552
+
553
+ # Suggest closest match
554
+ suggestion = self._find_closest_parameter_match(param_name, valid_names)
555
+
556
+ errors.append(
557
+ ValidationError(
558
+ code="unrecognized_parameter",
559
+ message=f"Unrecognized parameter: '{param_name}'",
560
+ path=[param_name],
561
+ severity=ValidationSeverity.HIGH,
562
+ original_value=original_value,
563
+ suggestion=suggestion,
564
+ )
565
+ )
566
+
567
+ return mapped_input, errors
568
+
569
+ def _find_closest_parameter_match(self, param_name: str, valid_names: Set[str]) -> Optional[str]:
570
+ """Find the closest matching valid parameter name"""
571
+ # Convert to lowercase for comparison
572
+ param_lower = param_name.lower()
573
+ valid_lower = {name.lower(): name for name in valid_names}
574
+
575
+ # Exact match (case-insensitive)
576
+ if param_lower in valid_lower:
577
+ return valid_lower[param_lower]
578
+
579
+ # Find best match using Levenshtein distance
580
+ best_match = None
581
+ best_score = float("inf")
582
+
583
+ for valid_lower_name, canonical_name in valid_lower.items():
584
+ # Simple similarity score
585
+ score = self._calculate_string_similarity(param_lower, valid_lower_name)
586
+
587
+ if score < best_score and score < 0.7: # Similarity threshold
588
+ best_score = score
589
+ best_match = canonical_name
590
+
591
+ return best_match
592
+
593
+ def _calculate_string_similarity(self, s1: str, s2: str) -> float:
594
+ """Calculate similarity between two strings (0-1, lower is more similar)"""
595
+ # Simple Levenshtein distance approximation
596
+ if not s1:
597
+ return len(s2)
598
+ if not s2:
599
+ return len(s1)
600
+
601
+ if len(s1) < len(s2):
602
+ s1, s2 = s2, s1
603
+
604
+ # Calculate distance
605
+ previous_row = list(range(len(s2) + 1))
606
+ for i, c1 in enumerate(s1):
607
+ current_row = [i + 1]
608
+ for j, c2 in enumerate(s2):
609
+ insertions = previous_row[j + 1] + 1
610
+ deletions = current_row[j] + 1
611
+ substitutions = previous_row[j] + (c1 != c2)
612
+ current_row.append(min(insertions, deletions, substitutions))
613
+ previous_row = current_row
614
+
615
+ distance = previous_row[-1]
616
+ max_len = max(len(s1), len(s2))
617
+ return distance / max_len if max_len > 0 else 0
618
+
619
+ def _validate_required_parameters(
620
+ self,
621
+ tool_params: List[ToolParameter],
622
+ input_data: Dict[str, Any],
623
+ ) -> List[ValidationError]:
624
+ """Validate that all required parameters are present"""
625
+ errors = []
626
+
627
+ for param in tool_params:
628
+ if param.required and param.name not in input_data:
629
+ errors.append(
630
+ ValidationError(
631
+ code="missing_required_parameter",
632
+ message=f"Missing required parameter: '{param.name}'",
633
+ path=[],
634
+ severity=ValidationSeverity.CRITICAL,
635
+ suggestion=f"Add '{param.name}' parameter",
636
+ )
637
+ )
638
+
639
+ return errors
640
+
641
+ def _apply_default_values(self, tool_params: List[ToolParameter], input_data: Dict[str, Any]) -> None:
642
+ """Apply default values for missing optional parameters"""
643
+ for param in tool_params:
644
+ if not param.required and param.name not in input_data and param.default_value is not None:
645
+ input_data[param.name] = param.default_value
646
+
647
+ def _validate_parameter_values(
648
+ self,
649
+ tool_params: List[ToolParameter],
650
+ input_data: Dict[str, Any],
651
+ ) -> List[ValidationError]:
652
+ """Validate parameter values against their types and constraints"""
653
+ errors = []
654
+
655
+ for param in tool_params:
656
+ if param.name not in input_data:
657
+ continue
658
+
659
+ value = input_data[param.name]
660
+
661
+ # Type validation
662
+ type_errors = self._validate_parameter_type(param, value, input_data)
663
+ errors.extend(type_errors)
664
+
665
+ # Custom validation function
666
+ if param.validation_function and not type_errors:
667
+ try:
668
+ if not param.validation_function(value):
669
+ errors.append(
670
+ ValidationError(
671
+ code="validation_function_failed",
672
+ message=f"Parameter '{param.name}' failed custom validation",
673
+ path=[param.name],
674
+ severity=ValidationSeverity.HIGH,
675
+ original_value=value,
676
+ )
677
+ )
678
+ except Exception as e:
679
+ errors.append(
680
+ ValidationError(
681
+ code="validation_function_error",
682
+ message=f"Error validating parameter '{param.name}': {str(e)}",
683
+ path=[param.name],
684
+ severity=ValidationSeverity.HIGH,
685
+ original_value=value,
686
+ )
687
+ )
688
+
689
+ return errors
690
+
691
+ def _validate_parameter_type(
692
+ self,
693
+ param: ToolParameter,
694
+ value: Any,
695
+ input_data: Dict[str, Any],
696
+ ) -> List[ValidationError]:
697
+ """Validate parameter value against expected type"""
698
+ errors: List[ValidationError] = []
699
+
700
+ # Type mapping
701
+ type_validators = {
702
+ "string": lambda v: isinstance(v, str),
703
+ "integer": lambda v: isinstance(v, int) or (isinstance(v, str) and v.isdigit()),
704
+ "boolean": lambda v: isinstance(v, bool) or str(v).lower() in ["true", "false", "1", "0"],
705
+ "dict": lambda v: isinstance(v, dict),
706
+ "list": lambda v: isinstance(v, list),
707
+ "float": lambda v: isinstance(v, float) or (isinstance(v, (int, str)) and self._is_float(v)),
708
+ }
709
+
710
+ validator = type_validators.get(param.param_type)
711
+ if not validator:
712
+ return errors
713
+
714
+ if not validator(value):
715
+ # Try to auto-convert
716
+ converted_value = self._convert_parameter_type(value, param.param_type)
717
+ if converted_value is not None:
718
+ # Apply the converted value to input_data
719
+ input_data[param.name] = converted_value
720
+ errors.append(
721
+ ValidationError(
722
+ code="type_conversion",
723
+ message=f"Converted parameter '{param.name}' from {type(value).__name__} to {param.param_type}",
724
+ path=[param.name],
725
+ severity=ValidationSeverity.LOW,
726
+ auto_corrected=True,
727
+ original_value=value,
728
+ corrected_value=converted_value,
729
+ )
730
+ )
731
+ else:
732
+ errors.append(
733
+ ValidationError(
734
+ code="type_mismatch",
735
+ message=f"Parameter '{param.name}' expects {param.param_type}, got {type(value).__name__}",
736
+ path=[param.name],
737
+ severity=ValidationSeverity.HIGH,
738
+ original_value=value,
739
+ suggestion=f"Provide a {param.param_type} value for '{param.name}'",
740
+ )
741
+ )
742
+
743
+ return errors
744
+
745
+ def _convert_parameter_type(self, value: Any, target_type: str) -> Any:
746
+ """Attempt to convert value to target type"""
747
+ try:
748
+ if target_type == "string":
749
+ return str(value)
750
+ elif target_type == "integer":
751
+ if isinstance(value, str):
752
+ # Handle negative numbers and leading/trailing whitespace
753
+ value = value.strip()
754
+ try:
755
+ return int(value)
756
+ except ValueError:
757
+ # Try to convert from float string
758
+ try:
759
+ return int(float(value))
760
+ except ValueError:
761
+ return None
762
+ elif isinstance(value, float):
763
+ return int(value)
764
+ elif isinstance(value, bool):
765
+ return int(value)
766
+ elif target_type == "boolean":
767
+ if isinstance(value, str):
768
+ return value.lower() in ["true", "1", "yes", "on"]
769
+ elif isinstance(value, (int, float)):
770
+ return bool(value)
771
+ elif target_type == "float":
772
+ if isinstance(value, str):
773
+ return float(value)
774
+ elif isinstance(value, int):
775
+ return float(value)
776
+ except (ValueError, TypeError):
777
+ pass
778
+
779
+ return None
780
+
781
+ def _is_float(self, value) -> bool:
782
+ """Check if value can be converted to float"""
783
+ try:
784
+ float(value)
785
+ return True
786
+ except (ValueError, TypeError):
787
+ return False
788
+
789
+ def _normalize_parameter_formats(self, tool_params: List[ToolParameter], input_data: Dict[str, Any]) -> List[str]:
790
+ """Normalize parameter formats for consistency"""
791
+ transformations = []
792
+
793
+ for param in tool_params:
794
+ if param.name not in input_data:
795
+ continue
796
+
797
+ value = input_data[param.name]
798
+
799
+ # Normalize boolean values
800
+ if param.param_type == "boolean":
801
+ if isinstance(value, str):
802
+ normalized_bool = value.lower() in ["true", "1", "yes", "on"]
803
+ if value != str(normalized_bool):
804
+ input_data[param.name] = normalized_bool
805
+ transformations.append(
806
+ f"Normalized '{param.name}' boolean from '{value}' to '{normalized_bool}'"
807
+ )
808
+
809
+ # Normalize file paths
810
+ elif param.name in ["file_path", "path", "directory"] and isinstance(value, str):
811
+ # Convert to forward slashes and remove trailing slash
812
+ normalized_path = value.replace("\\", "/").rstrip("/")
813
+ if value != normalized_path:
814
+ input_data[param.name] = normalized_path
815
+ transformations.append(f"Normalized '{param.name}' path from '{value}' to '{normalized_path}'")
816
+
817
+ # Normalize numeric formats - Always attempt conversion for numeric types
818
+ elif param.param_type in ["integer", "float"] and isinstance(value, str):
819
+ try:
820
+ if param.param_type == "integer":
821
+ normalized_num: int | float = int(float(value.strip())) # Handle "123.0" -> 123
822
+ else: # float
823
+ normalized_num = float(value.strip())
824
+
825
+ input_data[param.name] = normalized_num
826
+ transformations.append(
827
+ f"Normalized '{param.name}' {param.param_type} from '{value}' to '{normalized_num}'"
828
+ )
829
+ except ValueError:
830
+ # Keep original value if conversion fails
831
+ pass
832
+
833
+ return transformations
834
+
835
+ def _check_deprecated_parameters(self, tool_params: List[ToolParameter], input_data: Dict[str, Any]) -> List[str]:
836
+ """Check for deprecated parameter usage"""
837
+ warnings = []
838
+
839
+ for param in tool_params:
840
+ if param.name not in input_data:
841
+ continue
842
+
843
+ # Check if parameter name is deprecated
844
+ for deprecated_alias in param.deprecated_aliases:
845
+ if deprecated_alias in input_data and param.name != deprecated_alias:
846
+ value = input_data[deprecated_alias]
847
+ input_data[param.name] = value
848
+ del input_data[deprecated_alias]
849
+
850
+ warnings.append(
851
+ f"Deprecated parameter '{deprecated_alias}' replaced with '{param.name}'. "
852
+ f"This alias will be removed in future versions."
853
+ )
854
+
855
+ return warnings
856
+
857
+ def get_validation_stats(self) -> Dict[str, Any]:
858
+ """Get input validation statistics"""
859
+ return {
860
+ **self.stats,
861
+ "tools_configured": len(self.tool_parameters),
862
+ "parameter_mappings": len(self.parameter_mappings),
863
+ "cache_size": len(self.validation_cache) if self.validation_cache else 0,
864
+ }
865
+
866
+ def register_tool_parameters(self, tool_name: str, parameters: List[ToolParameter]) -> None:
867
+ """Register custom tool parameters"""
868
+ self.tool_parameters[tool_name] = parameters
869
+
870
+ def add_parameter_mapping(self, from_key: str, to_key: str) -> None:
871
+ """Add custom parameter mapping"""
872
+ self.parameter_mappings[from_key] = to_key
873
+
874
+ def export_validation_report(self, output_path: str) -> None:
875
+ """Export validation report to file"""
876
+ report = {
877
+ "generated_at": __import__("time").time(),
878
+ "stats": self.get_validation_stats(),
879
+ "configured_tools": list(self.tool_parameters.keys()),
880
+ "parameter_mappings": self.parameter_mappings,
881
+ }
882
+
883
+ with open(output_path, "w", encoding="utf-8") as f:
884
+ json.dump(report, f, indent=2, ensure_ascii=False)
885
+
886
+
887
+ # Global instance for easy import
888
+ validation_middleware = EnhancedInputValidationMiddleware()
889
+
890
+
891
+ def validate_tool_input(tool_name: str, input_data: Dict[str, Any]) -> ValidationResult:
892
+ """Convenience function for tool input validation"""
893
+ return validation_middleware.validate_and_normalize_input(tool_name, input_data)
894
+
895
+
896
+ def get_validation_stats() -> Dict[str, Any]:
897
+ """Convenience function to get validation statistics"""
898
+ return validation_middleware.get_validation_stats()
899
+
900
+
901
+ if __name__ == "__main__":
902
+ # Demo script for testing the input validation middleware
903
+ print("šŸ”§ MoAI-ADK Enhanced Input Validation Middleware Demo")
904
+ print("=" * 60)
905
+
906
+ # Test cases that reproduce the debug log errors
907
+ test_cases = [
908
+ {
909
+ "name": "Grep with head_limit (debug log error)",
910
+ "tool": "Grep",
911
+ "input": {
912
+ "pattern": "test",
913
+ "head_limit": 10, # This was causing the error
914
+ "output_mode": "content",
915
+ },
916
+ },
917
+ {
918
+ "name": "Grep with alternative parameter names",
919
+ "tool": "Grep",
920
+ "input": {
921
+ "pattern": "test",
922
+ "max_results": 20, # Should be mapped to head_limit
923
+ "search_path": "/src", # Should be mapped to path
924
+ },
925
+ },
926
+ {
927
+ "name": "Grep with deprecated parameters",
928
+ "tool": "Grep",
929
+ "input": {
930
+ "pattern": "test",
931
+ "count": 15, # Deprecated alias
932
+ "folder": "/src", # Should be mapped to path
933
+ },
934
+ },
935
+ {
936
+ "name": "Read with parameter aliases",
937
+ "tool": "Read",
938
+ "input": {
939
+ "filename": "/path/to/file.txt", # Should be mapped to file_path
940
+ "start_line": 10, # Should be mapped to offset
941
+ "lines": 50, # Should be mapped to limit
942
+ },
943
+ },
944
+ {
945
+ "name": "Task with mixed parameter names",
946
+ "tool": "Task",
947
+ "input": {
948
+ "agent_type": "debug-helper", # Should be mapped to subagent_type
949
+ "message": "test message", # Should be mapped to prompt
950
+ "verbose": True, # Should be mapped to debug
951
+ },
952
+ },
953
+ {
954
+ "name": "Bash with alternative parameters",
955
+ "tool": "Bash",
956
+ "input": {
957
+ "cmd": "ls -la", # Should be mapped to command
958
+ "cwd": "/home/user", # Should be mapped to working_directory
959
+ "timeout_ms": 5000, # Should be mapped to timeout
960
+ },
961
+ },
962
+ ]
963
+
964
+ for i, test_case in enumerate(test_cases, 1):
965
+ print(f"\n{i}. {test_case['name']}")
966
+ tool_name: str = test_case["tool"] # type: ignore[assignment]
967
+ tool_input: Dict[str, Any] = test_case["input"] # type: ignore[assignment]
968
+ print(f" Tool: {tool_name}")
969
+ print(f" Original input: {tool_input}")
970
+
971
+ result = validate_tool_input(tool_name, tool_input)
972
+
973
+ print(f" Valid: {result.valid}")
974
+ print(f" Errors: {len(result.errors)}")
975
+ print(f" Warnings: {len(result.warnings)}")
976
+ print(f" Transformations: {len(result.transformations)}")
977
+ print(f" Processing time: {result.processing_time_ms:.2f}ms")
978
+
979
+ if result.errors:
980
+ print(" Error details:")
981
+ for error in result.errors:
982
+ status = "āœ… AUTO-CORRECTED" if error.auto_corrected else "āŒ NOT FIXED"
983
+ print(f" • {error.message} [{status}]")
984
+ if error.suggestion:
985
+ print(f" Suggestion: {error.suggestion}")
986
+
987
+ if result.warnings:
988
+ print(" Warnings:")
989
+ for warning in result.warnings:
990
+ print(f" • {warning}")
991
+
992
+ if result.transformations:
993
+ print(" Transformations:")
994
+ for transform in result.transformations:
995
+ print(f" • {transform}")
996
+
997
+ print(f" Normalized input: {result.normalized_input}")
998
+
999
+ print("\nšŸ“Š Validation Statistics:")
1000
+ stats = get_validation_stats()
1001
+ for key, value in stats.items():
1002
+ print(f" {key}: {value}")
1003
+
1004
+ print("\n✨ Demo completed! The Enhanced Input Validation Middleware addresses")
1005
+ print(" the tool input validation failures from the debug logs with automatic")
1006
+ print(" parameter mapping and intelligent correction.")