moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- 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 +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- 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 +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- 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 +4 -12
- 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 +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- 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/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -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 +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -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-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -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-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -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/design-system-tokens.md +405 -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 +491 -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-foundation-claude/SKILL.md +201 -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-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -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 +346 -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-quality/SKILL.md +362 -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-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -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 +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -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-shadcn/SKILL.md +370 -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-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -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 +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -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/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -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 +71 -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-templates/SKILL.md +374 -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-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -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/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/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 +410 -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 +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -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 +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
# Data Validation and Schema Management
|
|
2
|
+
|
|
3
|
+
> Module: Comprehensive data validation system
|
|
4
|
+
> Complexity: Advanced
|
|
5
|
+
> Time: 25+ minutes
|
|
6
|
+
> Dependencies: typing, dataclasses, enum, re, datetime, jsonschema (optional)
|
|
7
|
+
|
|
8
|
+
## Advanced Validation System
|
|
9
|
+
|
|
10
|
+
```python
|
|
11
|
+
from typing import Type, Dict, Any, List, Optional, Union
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from enum import Enum
|
|
14
|
+
import re
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
|
|
17
|
+
class ValidationType(Enum):
|
|
18
|
+
STRING = "string"
|
|
19
|
+
INTEGER = "integer"
|
|
20
|
+
FLOAT = "float"
|
|
21
|
+
BOOLEAN = "boolean"
|
|
22
|
+
ARRAY = "array"
|
|
23
|
+
OBJECT = "object"
|
|
24
|
+
DATETIME = "datetime"
|
|
25
|
+
EMAIL = "email"
|
|
26
|
+
URL = "url"
|
|
27
|
+
UUID = "uuid"
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class ValidationRule:
|
|
31
|
+
"""Individual validation rule configuration."""
|
|
32
|
+
type: ValidationType
|
|
33
|
+
required: bool = True
|
|
34
|
+
min_length: Optional[int] = None
|
|
35
|
+
max_length: Optional[int] = None
|
|
36
|
+
min_value: Optional[Union[int, float]] = None
|
|
37
|
+
max_value: Optional[Union[int, float]] = None
|
|
38
|
+
pattern: Optional[str] = None
|
|
39
|
+
allowed_values: Optional[List[Any]] = None
|
|
40
|
+
custom_validator: Optional[callable] = None
|
|
41
|
+
|
|
42
|
+
class DataValidator:
|
|
43
|
+
"""Comprehensive data validation system."""
|
|
44
|
+
|
|
45
|
+
def __init__(self):
|
|
46
|
+
self.compiled_patterns = {}
|
|
47
|
+
self.global_validators = {}
|
|
48
|
+
|
|
49
|
+
def create_schema(self, field_definitions: Dict[str, Dict]) -> Dict[str, ValidationRule]:
|
|
50
|
+
"""Create validation schema from field definitions."""
|
|
51
|
+
schema = {}
|
|
52
|
+
|
|
53
|
+
for field_name, field_config in field_definitions.items():
|
|
54
|
+
validation_type = ValidationType(field_config.get('type', 'string'))
|
|
55
|
+
rule = ValidationRule(
|
|
56
|
+
type=validation_type,
|
|
57
|
+
required=field_config.get('required', True),
|
|
58
|
+
min_length=field_config.get('min_length'),
|
|
59
|
+
max_length=field_config.get('max_length'),
|
|
60
|
+
min_value=field_config.get('min_value'),
|
|
61
|
+
max_value=field_config.get('max_value'),
|
|
62
|
+
pattern=field_config.get('pattern'),
|
|
63
|
+
allowed_values=field_config.get('allowed_values'),
|
|
64
|
+
custom_validator=field_config.get('custom_validator')
|
|
65
|
+
)
|
|
66
|
+
schema[field_name] = rule
|
|
67
|
+
|
|
68
|
+
return schema
|
|
69
|
+
|
|
70
|
+
def validate(self, data: Any, schema: Dict[str, ValidationRule]) -> Dict[str, Any]:
|
|
71
|
+
"""Validate data against schema and return results."""
|
|
72
|
+
errors = {}
|
|
73
|
+
warnings = {}
|
|
74
|
+
sanitized_data = {}
|
|
75
|
+
|
|
76
|
+
for field_name, rule in schema.items():
|
|
77
|
+
value = data.get(field_name)
|
|
78
|
+
|
|
79
|
+
# Check required fields
|
|
80
|
+
if rule.required and value is None:
|
|
81
|
+
errors[field_name] = f"Field '{field_name}' is required"
|
|
82
|
+
continue
|
|
83
|
+
|
|
84
|
+
if value is None:
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
# Type validation
|
|
88
|
+
if not self._validate_type(value, rule.type):
|
|
89
|
+
errors[field_name] = f"Field '{field_name}' must be of type {rule.type.value}"
|
|
90
|
+
continue
|
|
91
|
+
|
|
92
|
+
# Length validation for strings
|
|
93
|
+
if rule.type == ValidationType.STRING:
|
|
94
|
+
if rule.min_length and len(value) < rule.min_length:
|
|
95
|
+
errors[field_name] = f"Field '{field_name}' must be at least {rule.min_length} characters"
|
|
96
|
+
elif rule.max_length and len(value) > rule.max_length:
|
|
97
|
+
errors[field_name] = f"Field '{field_name}' must be at most {rule.max_length} characters"
|
|
98
|
+
|
|
99
|
+
# Value range validation
|
|
100
|
+
if rule.type in [ValidationType.INTEGER, ValidationType.FLOAT]:
|
|
101
|
+
if rule.min_value is not None and value < rule.min_value:
|
|
102
|
+
errors[field_name] = f"Field '{field_name}' must be at least {rule.min_value}"
|
|
103
|
+
elif rule.max_value is not None and value > rule.max_value:
|
|
104
|
+
errors[field_name] = f"Field '{field_name}' must be at most {rule.max_value}"
|
|
105
|
+
|
|
106
|
+
# Pattern validation
|
|
107
|
+
if rule.pattern:
|
|
108
|
+
if not self._validate_pattern(value, rule.pattern):
|
|
109
|
+
errors[field_name] = f"Field '{field_name}' does not match required pattern"
|
|
110
|
+
|
|
111
|
+
# Allowed values validation
|
|
112
|
+
if rule.allowed_values and value not in rule.allowed_values:
|
|
113
|
+
errors[field_name] = f"Field '{field_name}' must be one of {rule.allowed_values}"
|
|
114
|
+
|
|
115
|
+
# Custom validation
|
|
116
|
+
if rule.custom_validator:
|
|
117
|
+
try:
|
|
118
|
+
custom_result = rule.custom_validator(value)
|
|
119
|
+
if custom_result is not True:
|
|
120
|
+
errors[field_name] = custom_result
|
|
121
|
+
except Exception as e:
|
|
122
|
+
errors[field_name] = f"Custom validation failed: {str(e)}"
|
|
123
|
+
|
|
124
|
+
# Sanitize and store valid data
|
|
125
|
+
sanitized_data[field_name] = self._sanitize_value(value, rule.type)
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
'valid': len(errors) == 0,
|
|
129
|
+
'errors': errors,
|
|
130
|
+
'warnings': warnings,
|
|
131
|
+
'sanitized_data': sanitized_data
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
def _validate_type(self, value: Any, validation_type: ValidationType) -> bool:
|
|
135
|
+
"""Validate value type."""
|
|
136
|
+
type_validators = {
|
|
137
|
+
ValidationType.STRING: lambda v: isinstance(v, str),
|
|
138
|
+
ValidationType.INTEGER: lambda v: isinstance(v, int) and not isinstance(v, bool),
|
|
139
|
+
ValidationType.FLOAT: lambda v: isinstance(v, (int, float)) and not isinstance(v, bool),
|
|
140
|
+
ValidationType.BOOLEAN: lambda v: isinstance(v, bool),
|
|
141
|
+
ValidationType.ARRAY: lambda v: isinstance(v, (list, tuple)),
|
|
142
|
+
ValidationType.OBJECT: lambda v: isinstance(v, dict),
|
|
143
|
+
ValidationType.DATETIME: lambda v: isinstance(v, datetime) or self._is_iso_datetime(v),
|
|
144
|
+
ValidationType.EMAIL: lambda v: isinstance(v, str) and self._is_email(v),
|
|
145
|
+
ValidationType.URL: lambda v: isinstance(v, str) and self._is_url(v),
|
|
146
|
+
ValidationType.UUID: lambda v: isinstance(v, str) and self._is_uuid(v)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return type_validators.get(validation_type, lambda v: False)(value)
|
|
150
|
+
|
|
151
|
+
def _validate_pattern(self, value: str, pattern: str) -> bool:
|
|
152
|
+
"""Validate string against regex pattern."""
|
|
153
|
+
if pattern not in self.compiled_patterns:
|
|
154
|
+
self.compiled_patterns[pattern] = re.compile(pattern)
|
|
155
|
+
|
|
156
|
+
return bool(self.compiled_patterns[pattern].match(value))
|
|
157
|
+
|
|
158
|
+
def _is_iso_datetime(self, value: str) -> bool:
|
|
159
|
+
"""Check if string is valid ISO datetime."""
|
|
160
|
+
try:
|
|
161
|
+
datetime.fromisoformat(value.replace('Z', '+00:00'))
|
|
162
|
+
return True
|
|
163
|
+
except ValueError:
|
|
164
|
+
return False
|
|
165
|
+
|
|
166
|
+
def _is_email(self, value: str) -> bool:
|
|
167
|
+
"""Simple email validation."""
|
|
168
|
+
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
|
|
169
|
+
return bool(re.match(pattern, value))
|
|
170
|
+
|
|
171
|
+
def _is_url(self, value: str) -> bool:
|
|
172
|
+
"""Simple URL validation."""
|
|
173
|
+
pattern = r'^https?://[^\s/$.?#].[^\s]*$'
|
|
174
|
+
return bool(re.match(pattern, value))
|
|
175
|
+
|
|
176
|
+
def _is_uuid(self, value: str) -> bool:
|
|
177
|
+
"""UUID validation."""
|
|
178
|
+
pattern = r'^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$'
|
|
179
|
+
return bool(re.match(pattern, value.lower()))
|
|
180
|
+
|
|
181
|
+
def _sanitize_value(self, value: Any, validation_type: ValidationType) -> Any:
|
|
182
|
+
"""Sanitize value based on type."""
|
|
183
|
+
sanitizers = {
|
|
184
|
+
ValidationType.STRING: lambda v: v.strip(),
|
|
185
|
+
ValidationType.INTEGER: lambda v: int(v),
|
|
186
|
+
ValidationType.FLOAT: lambda v: float(v),
|
|
187
|
+
ValidationType.BOOLEAN: lambda v: bool(v),
|
|
188
|
+
ValidationType.ARRAY: lambda v: list(v),
|
|
189
|
+
ValidationType.DATETIME: lambda v: datetime.fromisoformat(v) if isinstance(v, str) else v,
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return sanitizers.get(validation_type, lambda v: v)(value)
|
|
193
|
+
|
|
194
|
+
# Schema evolution manager
|
|
195
|
+
class SchemaEvolution:
|
|
196
|
+
"""Manage schema evolution and migration."""
|
|
197
|
+
|
|
198
|
+
def __init__(self):
|
|
199
|
+
self.version_history = {}
|
|
200
|
+
self.migrations = {}
|
|
201
|
+
|
|
202
|
+
def register_schema(self, version: str, schema: Dict):
|
|
203
|
+
"""Register schema version."""
|
|
204
|
+
self.version_history[version] = {
|
|
205
|
+
'schema': schema,
|
|
206
|
+
'timestamp': datetime.now(),
|
|
207
|
+
'version': version
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
def add_migration(self, from_version: str, to_version: str, migration_func: callable):
|
|
211
|
+
"""Add migration function between schema versions."""
|
|
212
|
+
migration_key = f"{from_version}->{to_version}"
|
|
213
|
+
self.migrations[migration_key] = migration_func
|
|
214
|
+
|
|
215
|
+
def migrate_data(self, data: Dict, from_version: str, to_version: str) -> Dict:
|
|
216
|
+
"""Migrate data between schema versions."""
|
|
217
|
+
current_data = data.copy()
|
|
218
|
+
current_version = from_version
|
|
219
|
+
|
|
220
|
+
while current_version != to_version:
|
|
221
|
+
# Find next migration path
|
|
222
|
+
migration_key = f"{current_version}->{to_version}"
|
|
223
|
+
if migration_key not in self.migrations:
|
|
224
|
+
raise ValueError(f"No migration path from {current_version} to {to_version}")
|
|
225
|
+
|
|
226
|
+
migration_func = self.migrations[migration_key]
|
|
227
|
+
current_data = migration_func(current_data)
|
|
228
|
+
current_version = to_version
|
|
229
|
+
|
|
230
|
+
return current_data
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Validation Patterns and Examples
|
|
234
|
+
|
|
235
|
+
### Common Validation Schemas
|
|
236
|
+
|
|
237
|
+
```python
|
|
238
|
+
class CommonSchemas:
|
|
239
|
+
"""Pre-defined validation schemas for common use cases."""
|
|
240
|
+
|
|
241
|
+
@staticmethod
|
|
242
|
+
def user_schema() -> Dict[str, ValidationRule]:
|
|
243
|
+
"""User data validation schema."""
|
|
244
|
+
validator = DataValidator()
|
|
245
|
+
return validator.create_schema({
|
|
246
|
+
"id": {"type": "integer", "required": True, "min_value": 1},
|
|
247
|
+
"username": {"type": "string", "required": True, "min_length": 3, "max_length": 50},
|
|
248
|
+
"email": {"type": "email", "required": True},
|
|
249
|
+
"age": {"type": "integer", "required": False, "min_value": 13, "max_value": 120},
|
|
250
|
+
"active": {"type": "boolean", "required": False},
|
|
251
|
+
"preferences": {"type": "object", "required": False},
|
|
252
|
+
"tags": {"type": "array", "required": False}
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
@staticmethod
|
|
256
|
+
def api_response_schema() -> Dict[str, ValidationRule]:
|
|
257
|
+
"""API response validation schema."""
|
|
258
|
+
validator = DataValidator()
|
|
259
|
+
return validator.create_schema({
|
|
260
|
+
"status": {"type": "string", "required": True, "allowed_values": ["success", "error"]},
|
|
261
|
+
"data": {"type": "object", "required": False},
|
|
262
|
+
"error": {"type": "string", "required": False},
|
|
263
|
+
"timestamp": {"type": "datetime", "required": True},
|
|
264
|
+
"request_id": {"type": "uuid", "required": True}
|
|
265
|
+
})
|
|
266
|
+
|
|
267
|
+
@staticmethod
|
|
268
|
+
def config_schema() -> Dict[str, ValidationRule]:
|
|
269
|
+
"""Configuration validation schema."""
|
|
270
|
+
validator = DataValidator()
|
|
271
|
+
return validator.create_schema({
|
|
272
|
+
"database": {
|
|
273
|
+
"type": "object",
|
|
274
|
+
"required": True,
|
|
275
|
+
"custom_validator": lambda v: isinstance(v, dict) and "url" in v
|
|
276
|
+
},
|
|
277
|
+
"api_keys": {"type": "object", "required": False},
|
|
278
|
+
"features": {
|
|
279
|
+
"type": "object",
|
|
280
|
+
"required": False,
|
|
281
|
+
"custom_validator": lambda v: all(isinstance(v[k], bool) for k in v)
|
|
282
|
+
},
|
|
283
|
+
"timeouts": {
|
|
284
|
+
"type": "object",
|
|
285
|
+
"required": False,
|
|
286
|
+
"custom_validator": lambda v: all(isinstance(v[k], (int, float)) for k in v)
|
|
287
|
+
}
|
|
288
|
+
})
|
|
289
|
+
|
|
290
|
+
# Usage examples
|
|
291
|
+
def example_validations():
|
|
292
|
+
validator = DataValidator()
|
|
293
|
+
|
|
294
|
+
# User data validation
|
|
295
|
+
user_schema = CommonSchemas.user_schema()
|
|
296
|
+
user_data = {
|
|
297
|
+
"id": 123,
|
|
298
|
+
"username": "john_doe",
|
|
299
|
+
"email": "john@example.com",
|
|
300
|
+
"age": 30,
|
|
301
|
+
"active": True
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
result = validator.validate(user_data, user_schema)
|
|
305
|
+
print("User validation:", result)
|
|
306
|
+
|
|
307
|
+
# Custom validation with regex
|
|
308
|
+
phone_schema = validator.create_schema({
|
|
309
|
+
"phone": {
|
|
310
|
+
"type": "string",
|
|
311
|
+
"required": True,
|
|
312
|
+
"pattern": r'^\+?1?-?\.?\s?\(?(\d{3})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})$'
|
|
313
|
+
}
|
|
314
|
+
})
|
|
315
|
+
|
|
316
|
+
# Complex nested validation
|
|
317
|
+
nested_schema = validator.create_schema({
|
|
318
|
+
"user": {"type": "object", "required": True},
|
|
319
|
+
"metadata": {
|
|
320
|
+
"type": "object",
|
|
321
|
+
"required": False,
|
|
322
|
+
"custom_validator": lambda v: isinstance(v, dict) and len(v) <= 10
|
|
323
|
+
},
|
|
324
|
+
"items": {
|
|
325
|
+
"type": "array",
|
|
326
|
+
"required": True,
|
|
327
|
+
"custom_validator": lambda v: len(v) >= 1
|
|
328
|
+
}
|
|
329
|
+
})
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Advanced Validation Techniques
|
|
333
|
+
|
|
334
|
+
```python
|
|
335
|
+
class AdvancedValidator:
|
|
336
|
+
"""Advanced validation with complex rules and cross-field validation."""
|
|
337
|
+
|
|
338
|
+
def __init__(self):
|
|
339
|
+
self.base_validator = DataValidator()
|
|
340
|
+
|
|
341
|
+
def validate_with_context(self, data: Dict, schema: Dict, context: Dict = None) -> Dict:
|
|
342
|
+
"""Validate data with additional context information."""
|
|
343
|
+
result = self.base_validator.validate(data, schema)
|
|
344
|
+
|
|
345
|
+
# Add context-aware validations
|
|
346
|
+
if context:
|
|
347
|
+
result.update(self._context_validation(data, context))
|
|
348
|
+
|
|
349
|
+
return result
|
|
350
|
+
|
|
351
|
+
def _context_validation(self, data: Dict, context: Dict) -> Dict:
|
|
352
|
+
"""Perform context-aware validations."""
|
|
353
|
+
context_errors = {}
|
|
354
|
+
|
|
355
|
+
# Example: Validate that user has permission for requested action
|
|
356
|
+
if 'user_role' in context and 'requested_action' in data:
|
|
357
|
+
user_role = context['user_role']
|
|
358
|
+
action = data['requested_action']
|
|
359
|
+
|
|
360
|
+
if not self._has_permission(user_role, action):
|
|
361
|
+
context_errors['permission'] = f"User role '{user_role}' cannot perform action '{action}'"
|
|
362
|
+
|
|
363
|
+
# Example: Validate business rules
|
|
364
|
+
if 'business_hours' in context and 'timestamp' in data:
|
|
365
|
+
timestamp = data['timestamp']
|
|
366
|
+
business_hours = context['business_hours']
|
|
367
|
+
|
|
368
|
+
if not self._is_within_business_hours(timestamp, business_hours):
|
|
369
|
+
context_errors['business_hours'] = "Action must be performed during business hours"
|
|
370
|
+
|
|
371
|
+
return {'context_errors': context_errors}
|
|
372
|
+
|
|
373
|
+
def validate_dependencies(self, data: Dict, dependencies: Dict) -> List[str]:
|
|
374
|
+
"""Validate field dependencies (e.g., if field A exists, field B must exist)."""
|
|
375
|
+
errors = []
|
|
376
|
+
|
|
377
|
+
for field, required_fields in dependencies.items():
|
|
378
|
+
if field in data:
|
|
379
|
+
for required_field in required_fields:
|
|
380
|
+
if required_field not in data:
|
|
381
|
+
errors.append(f"Field '{required_field}' is required when '{field}' is present")
|
|
382
|
+
|
|
383
|
+
return errors
|
|
384
|
+
|
|
385
|
+
def validate_conditional_requirements(self, data: Dict, conditions: Dict) -> List[str]:
|
|
386
|
+
"""Validate conditional requirements based on field values."""
|
|
387
|
+
errors = []
|
|
388
|
+
|
|
389
|
+
for field, condition_rules in conditions.items():
|
|
390
|
+
if field in data:
|
|
391
|
+
field_value = data[field]
|
|
392
|
+
for condition, required_fields in condition_rules.items():
|
|
393
|
+
if self._evaluate_condition(field_value, condition):
|
|
394
|
+
for required_field in required_fields:
|
|
395
|
+
if required_field not in data:
|
|
396
|
+
errors.append(f"Field '{required_field}' is required when '{field}' {condition}")
|
|
397
|
+
|
|
398
|
+
return errors
|
|
399
|
+
|
|
400
|
+
def _has_permission(self, role: str, action: str) -> bool:
|
|
401
|
+
"""Check if user role has permission for action."""
|
|
402
|
+
permissions = {
|
|
403
|
+
'admin': ['read', 'write', 'delete', 'admin'],
|
|
404
|
+
'editor': ['read', 'write'],
|
|
405
|
+
'viewer': ['read']
|
|
406
|
+
}
|
|
407
|
+
return action in permissions.get(role, [])
|
|
408
|
+
|
|
409
|
+
def _is_within_business_hours(self, timestamp: datetime, business_hours: Dict) -> bool:
|
|
410
|
+
"""Check if timestamp is within business hours."""
|
|
411
|
+
if not isinstance(timestamp, datetime):
|
|
412
|
+
return True # Skip validation if not a datetime
|
|
413
|
+
|
|
414
|
+
weekday = timestamp.weekday() # 0 = Monday, 6 = Sunday
|
|
415
|
+
hour = timestamp.hour
|
|
416
|
+
|
|
417
|
+
if weekday >= 5: # Weekend
|
|
418
|
+
return business_hours.get('weekend_enabled', False)
|
|
419
|
+
|
|
420
|
+
start_hour = business_hours.get('start_hour', 9)
|
|
421
|
+
end_hour = business_hours.get('end_hour', 17)
|
|
422
|
+
|
|
423
|
+
return start_hour <= hour < end_hour
|
|
424
|
+
|
|
425
|
+
def _evaluate_condition(self, value: Any, condition: str) -> bool:
|
|
426
|
+
"""Evaluate a condition string against a value."""
|
|
427
|
+
# Simple implementation - could be enhanced with more complex condition parsing
|
|
428
|
+
if condition.startswith('>'):
|
|
429
|
+
try:
|
|
430
|
+
return value > int(condition[1:])
|
|
431
|
+
except ValueError:
|
|
432
|
+
return False
|
|
433
|
+
elif condition.startswith('<'):
|
|
434
|
+
try:
|
|
435
|
+
return value < int(condition[1:])
|
|
436
|
+
except ValueError:
|
|
437
|
+
return False
|
|
438
|
+
elif condition.startswith('=='):
|
|
439
|
+
return value == condition[2:]
|
|
440
|
+
else:
|
|
441
|
+
# Default: check if value equals condition string
|
|
442
|
+
return str(value) == condition
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Performance Optimization for Validation
|
|
446
|
+
|
|
447
|
+
```python
|
|
448
|
+
class OptimizedValidator:
|
|
449
|
+
"""Performance-optimized validation with caching and batching."""
|
|
450
|
+
|
|
451
|
+
def __init__(self):
|
|
452
|
+
self.base_validator = DataValidator()
|
|
453
|
+
self.schema_cache = {}
|
|
454
|
+
self.pattern_cache = {}
|
|
455
|
+
|
|
456
|
+
def validate_batch(self, data_list: List[Dict], schema: Dict) -> List[Dict]:
|
|
457
|
+
"""Validate multiple data items efficiently."""
|
|
458
|
+
results = []
|
|
459
|
+
|
|
460
|
+
# Pre-compile patterns for better performance
|
|
461
|
+
self._compile_schema_patterns(schema)
|
|
462
|
+
|
|
463
|
+
for data in data_list:
|
|
464
|
+
result = self.base_validator.validate(data, schema)
|
|
465
|
+
results.append(result)
|
|
466
|
+
|
|
467
|
+
return results
|
|
468
|
+
|
|
469
|
+
def _compile_schema_patterns(self, schema: Dict):
|
|
470
|
+
"""Pre-compile regex patterns in schema."""
|
|
471
|
+
for field_name, rule in schema.items():
|
|
472
|
+
if rule.pattern and rule.pattern not in self.pattern_cache:
|
|
473
|
+
self.pattern_cache[rule.pattern] = re.compile(rule.pattern)
|
|
474
|
+
|
|
475
|
+
def get_cached_schema(self, schema_key: str, schema_factory: callable) -> Dict:
|
|
476
|
+
"""Get schema from cache or create and cache it."""
|
|
477
|
+
if schema_key not in self.schema_cache:
|
|
478
|
+
self.schema_cache[schema_key] = schema_factory()
|
|
479
|
+
return self.schema_cache[schema_key]
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
Module: `modules/data-validation.md`
|
|
485
|
+
Related: [TOON Encoding](./toon-encoding.md) | [JSON Optimization](./json-optimization.md)
|