moai-adk 0.35.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -0
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +1 -0
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +605 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +24 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -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.")
|