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,639 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Configuration Validator for Hooks System
|
|
3
|
+
|
|
4
|
+
Validates and normalizes configuration settings for timeout management,
|
|
5
|
+
resource limits, and hook behavior patterns.
|
|
6
|
+
|
|
7
|
+
Features:
|
|
8
|
+
- Schema validation for timeout configurations
|
|
9
|
+
- Default value normalization
|
|
10
|
+
- Configuration migration support
|
|
11
|
+
- Validation error reporting
|
|
12
|
+
- Performance impact assessment
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import logging
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from enum import Enum
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ValidationLevel(Enum):
|
|
24
|
+
"""Severity levels for validation issues"""
|
|
25
|
+
|
|
26
|
+
INFO = "info"
|
|
27
|
+
WARNING = "warning"
|
|
28
|
+
ERROR = "error"
|
|
29
|
+
CRITICAL = "critical"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class ValidationIssue:
|
|
34
|
+
"""Configuration validation issue with context"""
|
|
35
|
+
|
|
36
|
+
level: ValidationLevel
|
|
37
|
+
path: str
|
|
38
|
+
message: str
|
|
39
|
+
suggestion: Optional[str] = None
|
|
40
|
+
current_value: Optional[str] = None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class TimeoutConfigSchema:
|
|
45
|
+
"""Schema for timeout configuration validation"""
|
|
46
|
+
|
|
47
|
+
min_timeout_ms: int = 500
|
|
48
|
+
max_timeout_ms: int = 30000
|
|
49
|
+
default_timeout_ms: int = 5000
|
|
50
|
+
recommended_retry_count: int = 2
|
|
51
|
+
max_retry_count: int = 5
|
|
52
|
+
default_retry_delay_ms: int = 200
|
|
53
|
+
max_retry_delay_ms: int = 5000
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class ResourceConfigSchema:
|
|
58
|
+
"""Schema for resource configuration validation"""
|
|
59
|
+
|
|
60
|
+
default_memory_limit_mb: int = 100
|
|
61
|
+
max_memory_limit_mb: int = 1000
|
|
62
|
+
default_max_workers: int = 4
|
|
63
|
+
max_max_workers: int = 16
|
|
64
|
+
cache_size_default: int = 100
|
|
65
|
+
cache_size_max: int = 1000
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class ConfigurationValidator:
|
|
69
|
+
"""Validates and normalizes hooks configuration
|
|
70
|
+
|
|
71
|
+
Features:
|
|
72
|
+
- Comprehensive schema validation
|
|
73
|
+
- Automatic value normalization
|
|
74
|
+
- Performance impact analysis
|
|
75
|
+
- Migration support for older configs
|
|
76
|
+
- Detailed validation reporting
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
def __init__(self):
|
|
80
|
+
self._logger = logging.getLogger(__name__)
|
|
81
|
+
self._timeout_schema = TimeoutConfigSchema()
|
|
82
|
+
self._resource_schema = ResourceConfigSchema()
|
|
83
|
+
|
|
84
|
+
# Hook-specific configuration templates
|
|
85
|
+
self._hook_templates = {
|
|
86
|
+
"session_start": {
|
|
87
|
+
"policy": "normal",
|
|
88
|
+
"timeout_ms": 5000,
|
|
89
|
+
"retry_count": 1,
|
|
90
|
+
"retry_delay_ms": 200,
|
|
91
|
+
"graceful_degradation": True,
|
|
92
|
+
"memory_limit_mb": 100,
|
|
93
|
+
},
|
|
94
|
+
"session_end": {
|
|
95
|
+
"policy": "normal",
|
|
96
|
+
"timeout_ms": 5000,
|
|
97
|
+
"retry_count": 1,
|
|
98
|
+
"retry_delay_ms": 500,
|
|
99
|
+
"graceful_degradation": True,
|
|
100
|
+
"memory_limit_mb": 150,
|
|
101
|
+
},
|
|
102
|
+
"pre_tool": {
|
|
103
|
+
"policy": "fast",
|
|
104
|
+
"timeout_ms": 2000,
|
|
105
|
+
"retry_count": 1,
|
|
106
|
+
"retry_delay_ms": 100,
|
|
107
|
+
"graceful_degradation": True,
|
|
108
|
+
"memory_limit_mb": 50,
|
|
109
|
+
},
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
def validate_config(self, config: Dict[str, Any]) -> Tuple[bool, List[ValidationIssue]]:
|
|
113
|
+
"""Validate complete configuration and return issues"""
|
|
114
|
+
issues = []
|
|
115
|
+
|
|
116
|
+
# Validate top-level structure
|
|
117
|
+
issues.extend(self._validate_structure(config))
|
|
118
|
+
|
|
119
|
+
# Validate timeout manager configuration
|
|
120
|
+
if "timeout_manager" in config:
|
|
121
|
+
issues.extend(self._validate_timeout_manager(config["timeout_manager"]))
|
|
122
|
+
|
|
123
|
+
# Validate hook-specific configurations
|
|
124
|
+
if "hook_configs" in config:
|
|
125
|
+
issues.extend(self._validate_hook_configs(config["hook_configs"]))
|
|
126
|
+
|
|
127
|
+
# Validate resource configurations
|
|
128
|
+
if "resources" in config:
|
|
129
|
+
issues.extend(self._validate_resources(config["resources"]))
|
|
130
|
+
|
|
131
|
+
# Validate performance settings
|
|
132
|
+
if "performance" in config:
|
|
133
|
+
issues.extend(self._validate_performance(config["performance"]))
|
|
134
|
+
|
|
135
|
+
is_valid = not any(issue.level in [ValidationLevel.ERROR, ValidationLevel.CRITICAL] for issue in issues)
|
|
136
|
+
return is_valid, issues
|
|
137
|
+
|
|
138
|
+
def _validate_structure(self, config: Dict[str, Any]) -> List[ValidationIssue]:
|
|
139
|
+
"""Validate top-level configuration structure"""
|
|
140
|
+
issues = []
|
|
141
|
+
|
|
142
|
+
# Check for required sections (optional for backward compatibility)
|
|
143
|
+
expected_sections = [
|
|
144
|
+
"timeout_manager",
|
|
145
|
+
"hook_configs",
|
|
146
|
+
"resources",
|
|
147
|
+
"performance",
|
|
148
|
+
]
|
|
149
|
+
for section in expected_sections:
|
|
150
|
+
if section not in config:
|
|
151
|
+
issues.append(
|
|
152
|
+
ValidationIssue(
|
|
153
|
+
level=ValidationLevel.INFO,
|
|
154
|
+
path=f".{section}",
|
|
155
|
+
message=f"Missing optional '{section}' configuration section",
|
|
156
|
+
suggestion=f"Add '{section}' section to enable advanced features",
|
|
157
|
+
)
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
return issues
|
|
161
|
+
|
|
162
|
+
def _validate_timeout_manager(self, timeout_config: Dict[str, Any]) -> List[ValidationIssue]:
|
|
163
|
+
"""Validate timeout manager configuration"""
|
|
164
|
+
issues = []
|
|
165
|
+
base_path = ".timeout_manager"
|
|
166
|
+
|
|
167
|
+
# Validate global timeout settings
|
|
168
|
+
if "global_timeout_ms" in timeout_config:
|
|
169
|
+
timeout_ms = timeout_config["global_timeout_ms"]
|
|
170
|
+
if not isinstance(timeout_ms, int) or timeout_ms < 0:
|
|
171
|
+
issues.append(
|
|
172
|
+
ValidationIssue(
|
|
173
|
+
level=ValidationLevel.ERROR,
|
|
174
|
+
path=f"{base_path}.global_timeout_ms",
|
|
175
|
+
message="Global timeout must be a non-negative integer",
|
|
176
|
+
current_value=str(timeout_ms),
|
|
177
|
+
suggestion="Use a positive integer like 5000 (5 seconds)",
|
|
178
|
+
)
|
|
179
|
+
)
|
|
180
|
+
elif timeout_ms < self._timeout_schema.min_timeout_ms:
|
|
181
|
+
issues.append(
|
|
182
|
+
ValidationIssue(
|
|
183
|
+
level=ValidationLevel.WARNING,
|
|
184
|
+
path=f"{base_path}.global_timeout_ms",
|
|
185
|
+
message=f"Global timeout is very low ({timeout_ms}ms)",
|
|
186
|
+
current_value=str(timeout_ms),
|
|
187
|
+
suggestion=f"Consider using at least {self._timeout_schema.min_timeout_ms}ms",
|
|
188
|
+
)
|
|
189
|
+
)
|
|
190
|
+
elif timeout_ms > self._timeout_schema.max_timeout_ms:
|
|
191
|
+
issues.append(
|
|
192
|
+
ValidationIssue(
|
|
193
|
+
level=ValidationLevel.WARNING,
|
|
194
|
+
path=f"{base_path}.global_timeout_ms",
|
|
195
|
+
message=f"Global timeout is very high ({timeout_ms}ms)",
|
|
196
|
+
current_value=str(timeout_ms),
|
|
197
|
+
suggestion=f"Consider using at most {self._timeout_schema.max_timeout_ms}ms",
|
|
198
|
+
)
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
# Validate default retry count
|
|
202
|
+
if "default_retry_count" in timeout_config:
|
|
203
|
+
retry_count = timeout_config["default_retry_count"]
|
|
204
|
+
if not isinstance(retry_count, int) or retry_count < 0:
|
|
205
|
+
issues.append(
|
|
206
|
+
ValidationIssue(
|
|
207
|
+
level=ValidationLevel.ERROR,
|
|
208
|
+
path=f"{base_path}.default_retry_count",
|
|
209
|
+
message="Default retry count must be a non-negative integer",
|
|
210
|
+
current_value=str(retry_count),
|
|
211
|
+
suggestion="Use an integer between 0 and 3",
|
|
212
|
+
)
|
|
213
|
+
)
|
|
214
|
+
elif retry_count > self._timeout_schema.max_retry_count:
|
|
215
|
+
issues.append(
|
|
216
|
+
ValidationIssue(
|
|
217
|
+
level=ValidationLevel.WARNING,
|
|
218
|
+
path=f"{base_path}.default_retry_count",
|
|
219
|
+
message=f"High retry count may cause performance issues ({retry_count})",
|
|
220
|
+
current_value=str(retry_count),
|
|
221
|
+
suggestion=f"Consider using at most {self._timeout_schema.max_retry_count} retries",
|
|
222
|
+
)
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
# Validate graceful degradation setting
|
|
226
|
+
if "graceful_degradation" in timeout_config:
|
|
227
|
+
graceful = timeout_config["graceful_degradation"]
|
|
228
|
+
if not isinstance(graceful, bool):
|
|
229
|
+
issues.append(
|
|
230
|
+
ValidationIssue(
|
|
231
|
+
level=ValidationLevel.ERROR,
|
|
232
|
+
path=f"{base_path}.graceful_degradation",
|
|
233
|
+
message="Graceful degradation must be a boolean",
|
|
234
|
+
current_value=str(graceful),
|
|
235
|
+
suggestion="Use true or false",
|
|
236
|
+
)
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
return issues
|
|
240
|
+
|
|
241
|
+
def _validate_hook_configs(self, hook_configs: Dict[str, Any]) -> List[ValidationIssue]:
|
|
242
|
+
"""Validate hook-specific configurations"""
|
|
243
|
+
issues = []
|
|
244
|
+
base_path = ".hook_configs"
|
|
245
|
+
|
|
246
|
+
for hook_name, config in hook_configs.items():
|
|
247
|
+
hook_path = f"{base_path}.{hook_name}"
|
|
248
|
+
issues.extend(self._validate_single_hook_config(hook_name, config, hook_path))
|
|
249
|
+
|
|
250
|
+
return issues
|
|
251
|
+
|
|
252
|
+
def _validate_single_hook_config(self, hook_name: str, config: Dict[str, Any], path: str) -> List[ValidationIssue]:
|
|
253
|
+
"""Validate configuration for a single hook"""
|
|
254
|
+
issues = []
|
|
255
|
+
|
|
256
|
+
# Get template for this hook type
|
|
257
|
+
self._get_hook_template(hook_name)
|
|
258
|
+
|
|
259
|
+
# Validate policy
|
|
260
|
+
if "policy" in config:
|
|
261
|
+
policy = config["policy"]
|
|
262
|
+
valid_policies = ["fast", "normal", "slow", "custom"]
|
|
263
|
+
if policy not in valid_policies:
|
|
264
|
+
issues.append(
|
|
265
|
+
ValidationIssue(
|
|
266
|
+
level=ValidationLevel.ERROR,
|
|
267
|
+
path=f"{path}.policy",
|
|
268
|
+
message=f"Invalid policy '{policy}'",
|
|
269
|
+
current_value=str(policy),
|
|
270
|
+
suggestion=f"Use one of: {', '.join(valid_policies)}",
|
|
271
|
+
)
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
# Validate timeout_ms
|
|
275
|
+
if "timeout_ms" in config:
|
|
276
|
+
timeout_ms = config["timeout_ms"]
|
|
277
|
+
if not isinstance(timeout_ms, int) or timeout_ms <= 0:
|
|
278
|
+
issues.append(
|
|
279
|
+
ValidationIssue(
|
|
280
|
+
level=ValidationLevel.ERROR,
|
|
281
|
+
path=f"{path}.timeout_ms",
|
|
282
|
+
message="Timeout must be a positive integer",
|
|
283
|
+
current_value=str(timeout_ms),
|
|
284
|
+
suggestion="Use a positive integer in milliseconds",
|
|
285
|
+
)
|
|
286
|
+
)
|
|
287
|
+
else:
|
|
288
|
+
# Policy-based timeout validation
|
|
289
|
+
if "policy" in config:
|
|
290
|
+
policy = config["policy"]
|
|
291
|
+
recommended = self._get_recommended_timeout(policy)
|
|
292
|
+
if timeout_ms < recommended * 0.5:
|
|
293
|
+
issues.append(
|
|
294
|
+
ValidationIssue(
|
|
295
|
+
level=ValidationLevel.WARNING,
|
|
296
|
+
path=f"{path}.timeout_ms",
|
|
297
|
+
message=f"Timeout is very low for '{policy}' policy",
|
|
298
|
+
current_value=str(timeout_ms),
|
|
299
|
+
suggestion=f"Consider using at least {recommended}ms",
|
|
300
|
+
)
|
|
301
|
+
)
|
|
302
|
+
elif timeout_ms > recommended * 3:
|
|
303
|
+
issues.append(
|
|
304
|
+
ValidationIssue(
|
|
305
|
+
level=ValidationLevel.WARNING,
|
|
306
|
+
path=f"{path}.timeout_ms",
|
|
307
|
+
message=f"Timeout is very high for '{policy}' policy",
|
|
308
|
+
current_value=str(timeout_ms),
|
|
309
|
+
suggestion=f"Consider using at most {recommended * 2}ms",
|
|
310
|
+
)
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
# Validate retry_count
|
|
314
|
+
if "retry_count" in config:
|
|
315
|
+
retry_count = config["retry_count"]
|
|
316
|
+
if not isinstance(retry_count, int) or retry_count < 0:
|
|
317
|
+
issues.append(
|
|
318
|
+
ValidationIssue(
|
|
319
|
+
level=ValidationLevel.ERROR,
|
|
320
|
+
path=f"{path}.retry_count",
|
|
321
|
+
message="Retry count must be a non-negative integer",
|
|
322
|
+
current_value=str(retry_count),
|
|
323
|
+
suggestion="Use an integer between 0 and 3",
|
|
324
|
+
)
|
|
325
|
+
)
|
|
326
|
+
elif retry_count > self._timeout_schema.max_retry_count:
|
|
327
|
+
issues.append(
|
|
328
|
+
ValidationIssue(
|
|
329
|
+
level=ValidationLevel.WARNING,
|
|
330
|
+
path=f"{path}.retry_count",
|
|
331
|
+
message=f"High retry count may cause delays ({retry_count})",
|
|
332
|
+
current_value=str(retry_count),
|
|
333
|
+
suggestion=f"Consider using at most {self._timeout_schema.max_retry_count} retries",
|
|
334
|
+
)
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
# Validate retry_delay_ms
|
|
338
|
+
if "retry_delay_ms" in config:
|
|
339
|
+
delay_ms = config["retry_delay_ms"]
|
|
340
|
+
if not isinstance(delay_ms, int) or delay_ms < 0:
|
|
341
|
+
issues.append(
|
|
342
|
+
ValidationIssue(
|
|
343
|
+
level=ValidationLevel.ERROR,
|
|
344
|
+
path=f"{path}.retry_delay_ms",
|
|
345
|
+
message="Retry delay must be a non-negative integer",
|
|
346
|
+
current_value=str(delay_ms),
|
|
347
|
+
suggestion="Use a positive integer in milliseconds",
|
|
348
|
+
)
|
|
349
|
+
)
|
|
350
|
+
elif delay_ms > self._timeout_schema.max_retry_delay_ms:
|
|
351
|
+
issues.append(
|
|
352
|
+
ValidationIssue(
|
|
353
|
+
level=ValidationLevel.WARNING,
|
|
354
|
+
path=f"{path}.retry_delay_ms",
|
|
355
|
+
message=f"High retry delay may cause poor performance ({delay_ms}ms)",
|
|
356
|
+
current_value=str(delay_ms),
|
|
357
|
+
suggestion=f"Consider using at most {self._timeout_schema.max_retry_delay_ms}ms",
|
|
358
|
+
)
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
return issues
|
|
362
|
+
|
|
363
|
+
def _validate_resources(self, resource_config: Dict[str, Any]) -> List[ValidationIssue]:
|
|
364
|
+
"""Validate resource configuration"""
|
|
365
|
+
issues = []
|
|
366
|
+
base_path = ".resources"
|
|
367
|
+
|
|
368
|
+
# Validate memory limits
|
|
369
|
+
if "memory_limits" in resource_config:
|
|
370
|
+
memory_config = resource_config["memory_limits"]
|
|
371
|
+
if "default_mb" in memory_config:
|
|
372
|
+
default_mb = memory_config["default_mb"]
|
|
373
|
+
if not isinstance(default_mb, int) or default_mb <= 0:
|
|
374
|
+
issues.append(
|
|
375
|
+
ValidationIssue(
|
|
376
|
+
level=ValidationLevel.ERROR,
|
|
377
|
+
path=f"{base_path}.memory_limits.default_mb",
|
|
378
|
+
message="Default memory limit must be a positive integer",
|
|
379
|
+
current_value=str(default_mb),
|
|
380
|
+
suggestion="Use a positive integer in MB",
|
|
381
|
+
)
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
if "max_mb" in memory_config:
|
|
385
|
+
max_mb = memory_config["max_mb"]
|
|
386
|
+
if not isinstance(max_mb, int) or max_mb <= 0:
|
|
387
|
+
issues.append(
|
|
388
|
+
ValidationIssue(
|
|
389
|
+
level=ValidationLevel.ERROR,
|
|
390
|
+
path=f"{base_path}.memory_limits.max_mb",
|
|
391
|
+
message="Maximum memory limit must be a positive integer",
|
|
392
|
+
current_value=str(max_mb),
|
|
393
|
+
suggestion="Use a positive integer in MB",
|
|
394
|
+
)
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
# Validate worker configurations
|
|
398
|
+
if "workers" in resource_config:
|
|
399
|
+
workers_config = resource_config["workers"]
|
|
400
|
+
if "default_max_workers" in workers_config:
|
|
401
|
+
max_workers = workers_config["default_max_workers"]
|
|
402
|
+
if not isinstance(max_workers, int) or max_workers <= 0:
|
|
403
|
+
issues.append(
|
|
404
|
+
ValidationIssue(
|
|
405
|
+
level=ValidationLevel.ERROR,
|
|
406
|
+
path=f"{base_path}.workers.default_max_workers",
|
|
407
|
+
message="Default max workers must be a positive integer",
|
|
408
|
+
current_value=str(max_workers),
|
|
409
|
+
suggestion="Use a positive integer between 1 and 8",
|
|
410
|
+
)
|
|
411
|
+
)
|
|
412
|
+
elif max_workers > self._resource_schema.max_max_workers:
|
|
413
|
+
issues.append(
|
|
414
|
+
ValidationIssue(
|
|
415
|
+
level=ValidationLevel.WARNING,
|
|
416
|
+
path=f"{base_path}.workers.default_max_workers",
|
|
417
|
+
message=f"High worker count may impact system performance ({max_workers})",
|
|
418
|
+
current_value=str(max_workers),
|
|
419
|
+
suggestion=f"Consider using at most {self._resource_schema.max_max_workers} workers",
|
|
420
|
+
)
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
return issues
|
|
424
|
+
|
|
425
|
+
def _validate_performance(self, performance_config: Dict[str, Any]) -> List[ValidationIssue]:
|
|
426
|
+
"""Validate performance-related configuration"""
|
|
427
|
+
issues = []
|
|
428
|
+
base_path = ".performance"
|
|
429
|
+
|
|
430
|
+
# Validate cache configuration
|
|
431
|
+
if "cache" in performance_config:
|
|
432
|
+
cache_config = performance_config["cache"]
|
|
433
|
+
if "size_limit" in cache_config:
|
|
434
|
+
size_limit = cache_config["size_limit"]
|
|
435
|
+
if not isinstance(size_limit, int) or size_limit <= 0:
|
|
436
|
+
issues.append(
|
|
437
|
+
ValidationIssue(
|
|
438
|
+
level=ValidationLevel.ERROR,
|
|
439
|
+
path=f"{base_path}.cache.size_limit",
|
|
440
|
+
message="Cache size limit must be a positive integer",
|
|
441
|
+
current_value=str(size_limit),
|
|
442
|
+
suggestion="Use a positive integer for cache size",
|
|
443
|
+
)
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
# Validate monitoring settings
|
|
447
|
+
if "monitoring" in performance_config:
|
|
448
|
+
monitoring_config = performance_config["monitoring"]
|
|
449
|
+
if "enabled" in monitoring_config:
|
|
450
|
+
enabled = monitoring_config["enabled"]
|
|
451
|
+
if not isinstance(enabled, bool):
|
|
452
|
+
issues.append(
|
|
453
|
+
ValidationIssue(
|
|
454
|
+
level=ValidationLevel.ERROR,
|
|
455
|
+
path=f"{base_path}.monitoring.enabled",
|
|
456
|
+
message="Monitoring enabled flag must be boolean",
|
|
457
|
+
current_value=str(enabled),
|
|
458
|
+
suggestion="Use true or false",
|
|
459
|
+
)
|
|
460
|
+
)
|
|
461
|
+
|
|
462
|
+
return issues
|
|
463
|
+
|
|
464
|
+
def _get_hook_template(self, hook_name: str) -> Dict[str, Any]:
|
|
465
|
+
"""Get configuration template for a hook type"""
|
|
466
|
+
# Match hook patterns to templates
|
|
467
|
+
for template_name, template in self._hook_templates.items():
|
|
468
|
+
if template_name in hook_name.lower():
|
|
469
|
+
return template
|
|
470
|
+
return self._hook_templates["session_start"] # Default template
|
|
471
|
+
|
|
472
|
+
def _get_recommended_timeout(self, policy: str) -> int:
|
|
473
|
+
"""Get recommended timeout for a policy"""
|
|
474
|
+
policy_timeouts = {"fast": 2000, "normal": 5000, "slow": 15000, "custom": 5000}
|
|
475
|
+
return policy_timeouts.get(policy, 5000)
|
|
476
|
+
|
|
477
|
+
def normalize_config(self, config: Dict[str, Any]) -> Dict[str, Any]:
|
|
478
|
+
"""Normalize and apply defaults to configuration"""
|
|
479
|
+
normalized = config.copy()
|
|
480
|
+
|
|
481
|
+
# Ensure timeout_manager section exists
|
|
482
|
+
if "timeout_manager" not in normalized:
|
|
483
|
+
normalized["timeout_manager"] = {}
|
|
484
|
+
|
|
485
|
+
timeout_manager = normalized["timeout_manager"]
|
|
486
|
+
|
|
487
|
+
# Apply defaults to timeout_manager
|
|
488
|
+
if "graceful_degradation" not in timeout_manager:
|
|
489
|
+
timeout_manager["graceful_degradation"] = True
|
|
490
|
+
|
|
491
|
+
if "default_retry_count" not in timeout_manager:
|
|
492
|
+
timeout_manager["default_retry_count"] = self._timeout_schema.recommended_retry_count
|
|
493
|
+
|
|
494
|
+
if "default_retry_delay_ms" not in timeout_manager:
|
|
495
|
+
timeout_manager["default_retry_delay_ms"] = self._timeout_schema.default_retry_delay_ms
|
|
496
|
+
|
|
497
|
+
# Ensure hook_configs section exists
|
|
498
|
+
if "hook_configs" not in normalized:
|
|
499
|
+
normalized["hook_configs"] = {}
|
|
500
|
+
|
|
501
|
+
# Apply defaults to known hook types
|
|
502
|
+
for hook_type, template in self._hook_templates.items():
|
|
503
|
+
if hook_type not in normalized["hook_configs"]:
|
|
504
|
+
# Look for existing hooks with this type
|
|
505
|
+
matching_hooks = [k for k in normalized["hook_configs"].keys() if hook_type in k.lower()]
|
|
506
|
+
if not matching_hooks:
|
|
507
|
+
# Add template as default
|
|
508
|
+
normalized["hook_configs"][hook_type] = template.copy()
|
|
509
|
+
|
|
510
|
+
# Ensure resources section exists
|
|
511
|
+
if "resources" not in normalized:
|
|
512
|
+
normalized["resources"] = {}
|
|
513
|
+
|
|
514
|
+
resources = normalized["resources"]
|
|
515
|
+
if "memory_limits" not in resources:
|
|
516
|
+
resources["memory_limits"] = {
|
|
517
|
+
"default_mb": self._resource_schema.default_memory_limit_mb,
|
|
518
|
+
"max_mb": self._resource_schema.max_memory_limit_mb,
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
if "workers" not in resources:
|
|
522
|
+
resources["workers"] = {"default_max_workers": self._resource_schema.default_max_workers}
|
|
523
|
+
|
|
524
|
+
# Ensure performance section exists
|
|
525
|
+
if "performance" not in normalized:
|
|
526
|
+
normalized["performance"] = {}
|
|
527
|
+
|
|
528
|
+
performance = normalized["performance"]
|
|
529
|
+
if "cache" not in performance:
|
|
530
|
+
performance["cache"] = {"size_limit": self._resource_schema.cache_size_default}
|
|
531
|
+
|
|
532
|
+
if "monitoring" not in performance:
|
|
533
|
+
performance["monitoring"] = {"enabled": True}
|
|
534
|
+
|
|
535
|
+
return normalized
|
|
536
|
+
|
|
537
|
+
def generate_report(self, issues: List[ValidationIssue]) -> str:
|
|
538
|
+
"""Generate human-readable validation report"""
|
|
539
|
+
if not issues:
|
|
540
|
+
return "â
Configuration validation passed with no issues found."
|
|
541
|
+
|
|
542
|
+
lines = ["đ Configuration Validation Report", ""]
|
|
543
|
+
|
|
544
|
+
# Group issues by severity
|
|
545
|
+
by_level: Dict[ValidationLevel, List[ValidationIssue]] = {}
|
|
546
|
+
for issue in issues:
|
|
547
|
+
if issue.level not in by_level:
|
|
548
|
+
by_level[issue.level] = []
|
|
549
|
+
by_level[issue.level].append(issue)
|
|
550
|
+
|
|
551
|
+
# Display issues by severity (most critical first)
|
|
552
|
+
level_order = [
|
|
553
|
+
ValidationLevel.CRITICAL,
|
|
554
|
+
ValidationLevel.ERROR,
|
|
555
|
+
ValidationLevel.WARNING,
|
|
556
|
+
ValidationLevel.INFO,
|
|
557
|
+
]
|
|
558
|
+
level_icons = {
|
|
559
|
+
ValidationLevel.CRITICAL: "đ¨",
|
|
560
|
+
ValidationLevel.ERROR: "â",
|
|
561
|
+
ValidationLevel.WARNING: "â ī¸",
|
|
562
|
+
ValidationLevel.INFO: "âšī¸",
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
for level in level_order:
|
|
566
|
+
if level in by_level:
|
|
567
|
+
lines.append(f"{level_icons[level]} {level.value.upper()} ISSUES ({len(by_level[level])})")
|
|
568
|
+
for issue in by_level[level]:
|
|
569
|
+
lines.append(f" âĸ {issue.path}: {issue.message}")
|
|
570
|
+
if issue.suggestion:
|
|
571
|
+
lines.append(f" đĄ Suggestion: {issue.suggestion}")
|
|
572
|
+
lines.append("")
|
|
573
|
+
|
|
574
|
+
return "\n".join(lines)
|
|
575
|
+
|
|
576
|
+
def validate_and_fix_config_file(self, config_path: Path) -> Tuple[bool, Dict[str, Any], List[ValidationIssue]]:
|
|
577
|
+
"""Validate and optionally fix a configuration file"""
|
|
578
|
+
try:
|
|
579
|
+
with open(config_path, "r", encoding="utf-8") as f:
|
|
580
|
+
config = json.load(f)
|
|
581
|
+
|
|
582
|
+
# Validate configuration
|
|
583
|
+
is_valid, issues = self.validate_config(config)
|
|
584
|
+
|
|
585
|
+
if not is_valid:
|
|
586
|
+
self._logger.warning(f"Configuration validation failed with {len(issues)} issues")
|
|
587
|
+
|
|
588
|
+
# Normalize configuration (apply defaults, fix minor issues)
|
|
589
|
+
normalized_config = self.normalize_config(config)
|
|
590
|
+
|
|
591
|
+
return is_valid, normalized_config, issues
|
|
592
|
+
|
|
593
|
+
except Exception as e:
|
|
594
|
+
error_issues = [
|
|
595
|
+
ValidationIssue(
|
|
596
|
+
level=ValidationLevel.CRITICAL,
|
|
597
|
+
path=".file",
|
|
598
|
+
message=f"Failed to load configuration file: {e}",
|
|
599
|
+
suggestion="Check file format and permissions",
|
|
600
|
+
)
|
|
601
|
+
]
|
|
602
|
+
return False, {}, error_issues
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
# Global validator instance
|
|
606
|
+
_validator = None
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
def get_config_validator() -> ConfigurationValidator:
|
|
610
|
+
"""Get the global configuration validator instance"""
|
|
611
|
+
global _validator
|
|
612
|
+
if _validator is None:
|
|
613
|
+
_validator = ConfigurationValidator()
|
|
614
|
+
return _validator
|
|
615
|
+
|
|
616
|
+
|
|
617
|
+
# Convenience functions
|
|
618
|
+
def validate_hook_config(
|
|
619
|
+
config_path: Optional[Path] = None,
|
|
620
|
+
) -> Tuple[bool, List[ValidationIssue]]:
|
|
621
|
+
"""Validate hooks configuration"""
|
|
622
|
+
validator = get_config_validator()
|
|
623
|
+
|
|
624
|
+
if config_path is None:
|
|
625
|
+
config_path = Path(".moai/config/config.yaml")
|
|
626
|
+
|
|
627
|
+
if not config_path.exists():
|
|
628
|
+
# Return success with info about missing file
|
|
629
|
+
return True, [
|
|
630
|
+
ValidationIssue(
|
|
631
|
+
level=ValidationLevel.INFO,
|
|
632
|
+
path=".file",
|
|
633
|
+
message="Configuration file not found, using defaults",
|
|
634
|
+
suggestion="Create a configuration file to customize hook behavior",
|
|
635
|
+
)
|
|
636
|
+
]
|
|
637
|
+
|
|
638
|
+
is_valid, normalized_config, issues = validator.validate_and_fix_config_file(config_path)
|
|
639
|
+
return is_valid, issues
|