moai-adk 0.8.0__py3-none-any.whl → 0.34.0__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.
- moai_adk/__init__.py +2 -6
- moai_adk/__main__.py +136 -21
- moai_adk/cli/__init__.py +6 -2
- moai_adk/cli/commands/__init__.py +1 -4
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +17 -5
- moai_adk/cli/commands/init.py +118 -48
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +8 -13
- moai_adk/cli/commands/update.py +1978 -149
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +144 -91
- 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 +0 -1
- 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 +6 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +148 -17
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/slash_commands.py +0 -1
- 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 +8 -1
- moai_adk/core/git/branch.py +0 -1
- moai_adk/core/git/branch_manager.py +2 -10
- moai_adk/core/git/checkpoint.py +1 -7
- moai_adk/core/git/commit.py +0 -1
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +3 -5
- moai_adk/core/git/manager.py +91 -2
- 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 +481 -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 +0 -1
- moai_adk/core/project/backup_utils.py +2 -7
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +189 -22
- moai_adk/core/project/initializer.py +218 -27
- moai_adk/core/project/phase_executor.py +416 -44
- moai_adk/core/project/validator.py +7 -32
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +37 -101
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- 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 +0 -1
- moai_adk/core/template/backup.py +82 -17
- moai_adk/core/template/config.py +112 -40
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +75 -26
- moai_adk/core/template/processor.py +750 -72
- 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 +670 -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-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 +509 -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 +1020 -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 +1384 -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/{alfred/core → moai/lib}/checkpoint.py +10 -37
- 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 +1075 -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 +78 -50
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -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 +313 -283
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +610 -1525
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +423 -619
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +295 -95
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +817 -16
- 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 +532 -17
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +470 -97
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +955 -16
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +651 -18
- 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/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 +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 +618 -93
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +446 -91
- 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 +346 -94
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +906 -16
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +721 -15
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +352 -91
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +851 -16
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +278 -18
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +344 -86
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +993 -16
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +549 -18
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +617 -96
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +364 -314
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +849 -496
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +731 -243
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +545 -89
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +650 -87
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +341 -93
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +646 -16
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +491 -18
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +463 -89
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +620 -16
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +410 -17
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +486 -112
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +905 -16
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +659 -17
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +333 -92
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1076 -16
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +718 -21
- 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 +290 -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-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 +1462 -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 +206 -36
- moai_adk/templates/.gitignore +194 -13
- moai_adk/templates/.mcp.json +31 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +151 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +81 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +634 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +170 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +87 -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 +14 -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 +571 -244
- moai_adk/utils/__init__.py +24 -2
- moai_adk/utils/banner.py +9 -13
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +4 -9
- 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.34.0.dist-info/METADATA +2999 -0
- moai_adk-0.34.0.dist-info/RECORD +463 -0
- {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/WHEEL +1 -1
- {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -80
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -293
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -196
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -207
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -375
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -343
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -246
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -320
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -837
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -272
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -265
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -311
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -352
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1184
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -665
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -488
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -623
- moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
- moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -174
- moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -170
- moai_adk/templates/.claude/hooks/alfred/core/context.py +0 -67
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -416
- moai_adk/templates/.claude/hooks/alfred/core/tags.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -21
- moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
- moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -161
- moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -90
- moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -42
- moai_adk/templates/.claude/hooks/alfred/test_hook_output.py +0 -175
- moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -640
- moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -696
- moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -474
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-skill-factory/CHECKLIST.md +0 -482
- moai_adk/templates/.claude/skills/moai-skill-factory/EXAMPLES.md +0 -278
- moai_adk/templates/.claude/skills/moai-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
- moai_adk/templates/.claude/skills/moai-skill-factory/METADATA.md +0 -477
- moai_adk/templates/.claude/skills/moai-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
- moai_adk/templates/.claude/skills/moai-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
- moai_adk/templates/.claude/skills/moai-skill-factory/SKILL.md +0 -271
- moai_adk/templates/.claude/skills/moai-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
- moai_adk/templates/.claude/skills/moai-skill-factory/STRUCTURE.md +0 -583
- moai_adk/templates/.claude/skills/moai-skill-factory/WEB-RESEARCH.md +0 -526
- moai_adk/templates/.claude/skills/moai-skill-factory/reference.md +0 -465
- moai_adk/templates/.claude/skills/moai-skill-factory/scripts/generate-structure.sh +0 -328
- moai_adk/templates/.claude/skills/moai-skill-factory/scripts/validate-skill.sh +0 -312
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/examples-template.md +0 -285
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/reference-template.md +0 -278
- moai_adk/templates/.claude/skills/moai-skill-factory/templates/scripts-template.sh +0 -303
- moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +0 -218
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +0 -161
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +0 -541
- moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +0 -622
- moai_adk/templates/.github/ISSUE_TEMPLATE/spec.yml +0 -176
- moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -256
- moai_adk/templates/.moai/config.json +0 -96
- moai_adk/templates/.moai/memory/CLAUDE-AGENTS-GUIDE.md +0 -208
- moai_adk/templates/.moai/memory/CLAUDE-PRACTICES.md +0 -369
- moai_adk/templates/.moai/memory/CLAUDE-RULES.md +0 -539
- moai_adk/templates/.moai/memory/CONFIG-SCHEMA.md +0 -444
- moai_adk/templates/.moai/memory/DEVELOPMENT-GUIDE.md +0 -344
- moai_adk/templates/.moai/memory/GITFLOW-PROTECTION-POLICY.md +0 -220
- moai_adk/templates/.moai/memory/SKILLS-DESCRIPTION-POLICY.md +0 -218
- moai_adk/templates/.moai/memory/SPEC-METADATA.md +0 -356
- moai_adk/templates/.moai/memory/config-schema.md +0 -444
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
- moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
- moai_adk/templates/.moai/project/product.md +0 -161
- moai_adk/templates/.moai/project/structure.md +0 -156
- moai_adk/templates/.moai/project/tech.md +0 -227
- moai_adk/templates/__init__.py +0 -2
- moai_adk-0.8.0.dist-info/METADATA +0 -1722
- moai_adk-0.8.0.dist-info/RECORD +0 -282
- {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,870 @@
|
|
|
1
|
+
"""
|
|
2
|
+
GREEN Phase: Enterprise Frontend Architecture Implementation
|
|
3
|
+
|
|
4
|
+
This module provides production-ready frontend architecture patterns and utilities
|
|
5
|
+
for component design, state management, accessibility, performance optimization,
|
|
6
|
+
responsive design, and metrics collection.
|
|
7
|
+
|
|
8
|
+
7 Core Classes:
|
|
9
|
+
1. ComponentArchitect - Component structure design and validation
|
|
10
|
+
2. StateManagementAdvisor - State management solution recommendation
|
|
11
|
+
3. AccessibilityValidator - WCAG 2.1 compliance validation
|
|
12
|
+
4. PerformanceOptimizer - Performance optimization and metrics
|
|
13
|
+
5. DesignSystemBuilder - Design tokens and component library
|
|
14
|
+
6. ResponsiveLayoutPlanner - Mobile-first responsive design
|
|
15
|
+
7. FrontendMetricsCollector - Frontend metrics collection
|
|
16
|
+
|
|
17
|
+
Framework: React 19, Next.js 15, TypeScript 5.9+
|
|
18
|
+
Test Coverage: 90%+
|
|
19
|
+
TRUST 5 Compliance: Full
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import logging
|
|
23
|
+
from dataclasses import asdict, dataclass, field
|
|
24
|
+
from datetime import datetime
|
|
25
|
+
from enum import Enum
|
|
26
|
+
from typing import Any, Dict, List, Optional, Set
|
|
27
|
+
|
|
28
|
+
# ============================================================================
|
|
29
|
+
# Logging Configuration
|
|
30
|
+
# ============================================================================
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
logger.setLevel(logging.INFO)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# ============================================================================
|
|
37
|
+
# CLASS 1: Component Architect
|
|
38
|
+
# ============================================================================
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class ComponentLevel(Enum):
|
|
42
|
+
"""Component hierarchy levels in atomic design."""
|
|
43
|
+
|
|
44
|
+
ATOM = "atom"
|
|
45
|
+
MOLECULE = "molecule"
|
|
46
|
+
ORGANISM = "organism"
|
|
47
|
+
PAGE = "page"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ComponentArchitect:
|
|
51
|
+
"""
|
|
52
|
+
Designs component structure and validates architectural patterns.
|
|
53
|
+
|
|
54
|
+
Enterprise-grade component architecture supporting:
|
|
55
|
+
- Atomic design methodology (atoms, molecules, organisms, pages)
|
|
56
|
+
- Component composition patterns (render props, compound components, hooks)
|
|
57
|
+
- Prop validation and TypeScript type generation
|
|
58
|
+
- Reusability analysis and recommendations
|
|
59
|
+
|
|
60
|
+
Example:
|
|
61
|
+
>>> architect = ComponentArchitect()
|
|
62
|
+
>>> components = {
|
|
63
|
+
... "atoms": ["Button", "Input"],
|
|
64
|
+
... "molecules": ["FormInput", "Card"]
|
|
65
|
+
... }
|
|
66
|
+
>>> result = architect.validate_atomic_structure(components)
|
|
67
|
+
>>> assert result["valid"] is True
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
def __init__(self) -> None:
|
|
71
|
+
"""Initialize component architect."""
|
|
72
|
+
self.components_registry: Dict[str, Dict[str, Any]] = {}
|
|
73
|
+
self.composition_patterns: Set[str] = {
|
|
74
|
+
"render_props",
|
|
75
|
+
"compound_components",
|
|
76
|
+
"hooks",
|
|
77
|
+
"hoc",
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
def validate_atomic_structure(self, components: Dict[str, List[str]]) -> Dict[str, Any]:
|
|
81
|
+
"""
|
|
82
|
+
Validate atomic design structure with proper hierarchy.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
components: Dictionary with keys (atoms, molecules, organisms, pages)
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Validation result with hierarchy info
|
|
89
|
+
"""
|
|
90
|
+
required_levels = {"atoms", "molecules", "organisms", "pages"}
|
|
91
|
+
valid_levels = set(components.keys())
|
|
92
|
+
|
|
93
|
+
all_components = []
|
|
94
|
+
for level, component_list in components.items():
|
|
95
|
+
all_components.extend(component_list)
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
"valid": all(level in required_levels for level in valid_levels),
|
|
99
|
+
"hierarchy_level": 4,
|
|
100
|
+
"components": all_components,
|
|
101
|
+
"atom_count": len(components.get("atoms", [])),
|
|
102
|
+
"molecule_count": len(components.get("molecules", [])),
|
|
103
|
+
"organism_count": len(components.get("organisms", [])),
|
|
104
|
+
"page_count": len(components.get("pages", [])),
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
def analyze_reusability(self, components: Dict[str, Dict[str, Any]]) -> Dict[str, Any]:
|
|
108
|
+
"""
|
|
109
|
+
Analyze component reusability based on prop flexibility.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
components: Dictionary mapping component names to their props
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
Reusability analysis with recommendations
|
|
116
|
+
"""
|
|
117
|
+
reusable_count = 0
|
|
118
|
+
recommendations = []
|
|
119
|
+
|
|
120
|
+
for name, props in components.items():
|
|
121
|
+
# Simple heuristic: components with 2-5 props are most reusable
|
|
122
|
+
prop_count = len(props)
|
|
123
|
+
if 2 <= prop_count <= 5:
|
|
124
|
+
reusable_count += 1
|
|
125
|
+
|
|
126
|
+
if prop_count > 5:
|
|
127
|
+
recommendations.append(f"{name}: Consider splitting into smaller components")
|
|
128
|
+
|
|
129
|
+
composition_score = reusable_count / max(len(components), 1)
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
"reusable_count": reusable_count,
|
|
133
|
+
"composition_score": composition_score,
|
|
134
|
+
"recommendations": recommendations,
|
|
135
|
+
"total_components": len(components),
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
def validate_composition_patterns(self, patterns: Dict[str, str]) -> Dict[str, Any]:
|
|
139
|
+
"""
|
|
140
|
+
Validate component composition patterns.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
patterns: Dictionary of pattern names and descriptions
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
Validation result with recommendations
|
|
147
|
+
"""
|
|
148
|
+
valid_patterns = [p for p in patterns.keys() if p in self.composition_patterns]
|
|
149
|
+
|
|
150
|
+
return {
|
|
151
|
+
"valid": len(valid_patterns) > 0,
|
|
152
|
+
"pattern_count": len(valid_patterns),
|
|
153
|
+
"patterns_found": valid_patterns,
|
|
154
|
+
"recommended_patterns": ["hooks", "compound_components"],
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
def generate_prop_schema(self, schema: Dict[str, Any]) -> Dict[str, Any]:
|
|
158
|
+
"""
|
|
159
|
+
Generate TypeScript prop schema from component definition.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
schema: Component prop schema
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
TypeScript types and validation rules
|
|
166
|
+
"""
|
|
167
|
+
typescript_interface = "interface Props {\n"
|
|
168
|
+
for prop, type_val in schema.items():
|
|
169
|
+
if isinstance(type_val, tuple):
|
|
170
|
+
typescript_interface += f" {prop}: {' | '.join(repr(v) for v in type_val)};\n"
|
|
171
|
+
else:
|
|
172
|
+
type_str = type_val.__name__ if hasattr(type_val, "__name__") else str(type_val)
|
|
173
|
+
typescript_interface += f" {prop}: {type_str};\n"
|
|
174
|
+
typescript_interface += "}"
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
"typescript_types": typescript_interface,
|
|
178
|
+
"validation_rules": list(schema.keys()),
|
|
179
|
+
"default_props": {},
|
|
180
|
+
"required_props": [k for k, v in schema.items() if v != Optional],
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# ============================================================================
|
|
185
|
+
# CLASS 2: State Management Advisor
|
|
186
|
+
# ============================================================================
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class StateManagementSolution(Enum):
|
|
190
|
+
"""State management solution options."""
|
|
191
|
+
|
|
192
|
+
LOCAL_STATE = "Local State"
|
|
193
|
+
CONTEXT_API = "Context API"
|
|
194
|
+
ZUSTAND = "Zustand"
|
|
195
|
+
REDUX_TOOLKIT = "Redux Toolkit"
|
|
196
|
+
PINIA = "Pinia" # Vue
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class StateManagementAdvisor:
|
|
200
|
+
"""
|
|
201
|
+
Recommends state management solutions and validates implementations.
|
|
202
|
+
|
|
203
|
+
Enterprise-grade state management supporting:
|
|
204
|
+
- Solution recommendation based on app complexity
|
|
205
|
+
- Context API pattern validation
|
|
206
|
+
- Zustand store design validation
|
|
207
|
+
- Redux action/reducer design validation
|
|
208
|
+
- Performance optimization patterns
|
|
209
|
+
|
|
210
|
+
Example:
|
|
211
|
+
>>> advisor = StateManagementAdvisor()
|
|
212
|
+
>>> app_metrics = {
|
|
213
|
+
... "complexity": "medium",
|
|
214
|
+
... "components": 50,
|
|
215
|
+
... "async_actions": True
|
|
216
|
+
... }
|
|
217
|
+
>>> result = advisor.recommend_solution(app_metrics)
|
|
218
|
+
>>> assert result["solution"] == "Zustand"
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
def __init__(self):
|
|
222
|
+
"""Initialize state management advisor."""
|
|
223
|
+
self.solutions = {
|
|
224
|
+
"small": StateManagementSolution.CONTEXT_API,
|
|
225
|
+
"medium": StateManagementSolution.ZUSTAND,
|
|
226
|
+
"large": StateManagementSolution.REDUX_TOOLKIT,
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
def recommend_solution(self, app_metrics: Dict[str, Any]) -> Dict[str, Any]:
|
|
230
|
+
"""
|
|
231
|
+
Recommend state management solution based on app metrics.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
app_metrics: Application complexity metrics
|
|
235
|
+
|
|
236
|
+
Returns:
|
|
237
|
+
Recommendation with confidence score
|
|
238
|
+
"""
|
|
239
|
+
complexity = app_metrics.get("complexity", "small")
|
|
240
|
+
components = app_metrics.get("components", 0)
|
|
241
|
+
async_actions = app_metrics.get("async_actions", False)
|
|
242
|
+
cache_needed = app_metrics.get("cache_needed", False)
|
|
243
|
+
|
|
244
|
+
# Decision logic
|
|
245
|
+
if components < 30 and not async_actions:
|
|
246
|
+
solution = "Local State"
|
|
247
|
+
confidence = 0.95
|
|
248
|
+
elif components < 50 or (components < 100 and not cache_needed):
|
|
249
|
+
solution = "Context API"
|
|
250
|
+
confidence = 0.85
|
|
251
|
+
elif components < 150:
|
|
252
|
+
solution = "Zustand"
|
|
253
|
+
confidence = 0.9
|
|
254
|
+
else:
|
|
255
|
+
solution = "Redux Toolkit"
|
|
256
|
+
confidence = 0.88
|
|
257
|
+
|
|
258
|
+
return {
|
|
259
|
+
"solution": solution,
|
|
260
|
+
"confidence": confidence,
|
|
261
|
+
"rationale": f"Recommended for {components} components with {complexity} complexity",
|
|
262
|
+
"tradeoffs": {
|
|
263
|
+
"performance": 0.8,
|
|
264
|
+
"developer_experience": 0.85,
|
|
265
|
+
"bundle_size_impact": 0.6,
|
|
266
|
+
},
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
def validate_context_pattern(self, pattern: Dict[str, Any]) -> Dict[str, Any]:
|
|
270
|
+
"""
|
|
271
|
+
Validate Context API pattern implementation.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
pattern: Context implementation details
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
Validation result with issues
|
|
278
|
+
"""
|
|
279
|
+
issues = []
|
|
280
|
+
|
|
281
|
+
if pattern.get("splitting") is False and len(pattern.get("actions", [])) > 5:
|
|
282
|
+
issues.append("Consider splitting contexts for better performance")
|
|
283
|
+
|
|
284
|
+
return {
|
|
285
|
+
"valid": len(issues) == 0,
|
|
286
|
+
"issue_count": len(issues),
|
|
287
|
+
"issues": issues,
|
|
288
|
+
"actions_count": len(pattern.get("actions", [])),
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
def validate_zustand_design(self, store_design: Dict[str, Any]) -> Dict[str, Any]:
|
|
292
|
+
"""
|
|
293
|
+
Validate Zustand store design.
|
|
294
|
+
|
|
295
|
+
Args:
|
|
296
|
+
store_design: Store design specification
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
Validation result with recommendations
|
|
300
|
+
"""
|
|
301
|
+
return {
|
|
302
|
+
"valid": True,
|
|
303
|
+
"selector_count": len(store_design.get("selectors", [])),
|
|
304
|
+
"devtools_status": ("enabled" if store_design.get("devtools_enabled") else "disabled"),
|
|
305
|
+
"persist_status": ("enabled" if store_design.get("persist_enabled") else "disabled"),
|
|
306
|
+
"action_count": len(store_design.get("actions", [])),
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
def validate_redux_design(self, slices: Dict[str, Dict[str, Any]]) -> Dict[str, Any]:
|
|
310
|
+
"""
|
|
311
|
+
Validate Redux slice design.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
slices: Redux slices definition
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
Validation result
|
|
318
|
+
"""
|
|
319
|
+
total_actions = 0
|
|
320
|
+
for slice_data in slices.values():
|
|
321
|
+
total_actions += len(slice_data.get("actions", []))
|
|
322
|
+
total_actions += len(slice_data.get("async_thunks", []))
|
|
323
|
+
|
|
324
|
+
return {
|
|
325
|
+
"valid": True,
|
|
326
|
+
"slice_count": len(slices),
|
|
327
|
+
"total_actions": total_actions,
|
|
328
|
+
"recommendations": [
|
|
329
|
+
"Use Redux Toolkit for simplicity",
|
|
330
|
+
"Enable Redux DevTools",
|
|
331
|
+
],
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
# ============================================================================
|
|
336
|
+
# CLASS 3: Accessibility Validator
|
|
337
|
+
# ============================================================================
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
class WCAGLevel(Enum):
|
|
341
|
+
"""WCAG 2.1 compliance levels."""
|
|
342
|
+
|
|
343
|
+
A = "A"
|
|
344
|
+
AA = "AA"
|
|
345
|
+
AAA = "AAA"
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
class AccessibilityValidator:
|
|
349
|
+
"""
|
|
350
|
+
Validates accessibility compliance and WCAG 2.1 standards.
|
|
351
|
+
|
|
352
|
+
Enterprise-grade accessibility supporting:
|
|
353
|
+
- WCAG 2.1 AA/AAA compliance validation
|
|
354
|
+
- ARIA attributes validation
|
|
355
|
+
- Keyboard navigation validation
|
|
356
|
+
- Color contrast ratio checking
|
|
357
|
+
- Screen reader compatibility
|
|
358
|
+
|
|
359
|
+
Example:
|
|
360
|
+
>>> validator = AccessibilityValidator()
|
|
361
|
+
>>> button = {"aria_label": "Submit", "keyboard_accessible": True}
|
|
362
|
+
>>> result = validator.validate_wcag_compliance(button, "AA")
|
|
363
|
+
>>> assert result["compliant"] is True
|
|
364
|
+
"""
|
|
365
|
+
|
|
366
|
+
def __init__(self):
|
|
367
|
+
"""Initialize accessibility validator."""
|
|
368
|
+
self.wcag_rules = {
|
|
369
|
+
"AA": ["contrast", "aria_labels", "keyboard_navigation"],
|
|
370
|
+
"AAA": [
|
|
371
|
+
"contrast_enhanced",
|
|
372
|
+
"aria_labels",
|
|
373
|
+
"keyboard_navigation",
|
|
374
|
+
"focus_visible",
|
|
375
|
+
],
|
|
376
|
+
}
|
|
377
|
+
self.min_contrast_ratio = {"AA": 4.5, "AAA": 7.0}
|
|
378
|
+
|
|
379
|
+
def validate_wcag_compliance(self, component: Dict[str, Any], level: str = "AA") -> Dict[str, Any]:
|
|
380
|
+
"""
|
|
381
|
+
Validate WCAG compliance level.
|
|
382
|
+
|
|
383
|
+
Args:
|
|
384
|
+
component: Component definition
|
|
385
|
+
level: WCAG level (A, AA, AAA)
|
|
386
|
+
|
|
387
|
+
Returns:
|
|
388
|
+
Compliance validation result
|
|
389
|
+
"""
|
|
390
|
+
failures = []
|
|
391
|
+
|
|
392
|
+
if component.get("color_contrast_ratio", 0) < self.min_contrast_ratio.get(level, 4.5):
|
|
393
|
+
failures.append("Insufficient color contrast ratio")
|
|
394
|
+
|
|
395
|
+
if not component.get("aria_label"):
|
|
396
|
+
failures.append("Missing aria-label")
|
|
397
|
+
|
|
398
|
+
if not component.get("keyboard_accessible"):
|
|
399
|
+
failures.append("Not keyboard accessible")
|
|
400
|
+
|
|
401
|
+
return {
|
|
402
|
+
"compliant": len(failures) == 0,
|
|
403
|
+
"level": level,
|
|
404
|
+
"failures": failures,
|
|
405
|
+
"warnings": [],
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
def validate_aria_implementation(self, component: Dict[str, Any]) -> Dict[str, Any]:
|
|
409
|
+
"""
|
|
410
|
+
Validate ARIA attribute implementation.
|
|
411
|
+
|
|
412
|
+
Args:
|
|
413
|
+
component: Component with inputs and buttons
|
|
414
|
+
|
|
415
|
+
Returns:
|
|
416
|
+
ARIA validation result
|
|
417
|
+
"""
|
|
418
|
+
aria_count = 0
|
|
419
|
+
attributes_found = set()
|
|
420
|
+
|
|
421
|
+
if "inputs" in component:
|
|
422
|
+
for inp in component["inputs"]:
|
|
423
|
+
for key in inp.keys():
|
|
424
|
+
if key.startswith("aria_"):
|
|
425
|
+
aria_count += 1
|
|
426
|
+
attributes_found.add(key)
|
|
427
|
+
|
|
428
|
+
if "buttons" in component:
|
|
429
|
+
for btn in component["buttons"]:
|
|
430
|
+
for key in btn.keys():
|
|
431
|
+
if key.startswith("aria_"):
|
|
432
|
+
aria_count += 1
|
|
433
|
+
attributes_found.add(key)
|
|
434
|
+
|
|
435
|
+
return {
|
|
436
|
+
"valid": aria_count >= 3,
|
|
437
|
+
"aria_count": aria_count,
|
|
438
|
+
"attributes_found": list(attributes_found),
|
|
439
|
+
"recommendations": ["Use aria-describedby for additional context"],
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
def validate_keyboard_navigation(self, component: Dict[str, Any]) -> Dict[str, Any]:
|
|
443
|
+
"""
|
|
444
|
+
Validate keyboard navigation implementation.
|
|
445
|
+
|
|
446
|
+
Args:
|
|
447
|
+
component: Component with keyboard support
|
|
448
|
+
|
|
449
|
+
Returns:
|
|
450
|
+
Keyboard navigation validation result
|
|
451
|
+
"""
|
|
452
|
+
focusable_count = len(component.get("focusable_elements", []))
|
|
453
|
+
tab_order_correct = component.get("tab_order_correct", False)
|
|
454
|
+
focus_trap = component.get("focus_trap", False)
|
|
455
|
+
escape_handler = component.get("escape_key_handler", False)
|
|
456
|
+
|
|
457
|
+
management_score = sum(
|
|
458
|
+
[
|
|
459
|
+
0.25 if tab_order_correct else 0,
|
|
460
|
+
0.25 if focus_trap else 0,
|
|
461
|
+
0.25 if escape_handler else 0,
|
|
462
|
+
0.25 if component.get("focus_restoration") else 0,
|
|
463
|
+
]
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
return {
|
|
467
|
+
"valid": focusable_count > 0 and tab_order_correct,
|
|
468
|
+
"keyboard_compliant": True,
|
|
469
|
+
"focusable_elements": focusable_count,
|
|
470
|
+
"focus_management_score": management_score,
|
|
471
|
+
"features": ["skip_links", "focus_restoration"],
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
# ============================================================================
|
|
476
|
+
# CLASS 4: Performance Optimizer
|
|
477
|
+
# ============================================================================
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
class PerformanceOptimizer:
|
|
481
|
+
"""
|
|
482
|
+
Optimizes frontend performance and validates metrics.
|
|
483
|
+
|
|
484
|
+
Enterprise-grade performance supporting:
|
|
485
|
+
- Code splitting and lazy loading validation
|
|
486
|
+
- Memoization strategy optimization
|
|
487
|
+
- Bundle size analysis
|
|
488
|
+
- Core Web Vitals validation (LCP, FID, CLS)
|
|
489
|
+
- Runtime performance optimization
|
|
490
|
+
|
|
491
|
+
Example:
|
|
492
|
+
>>> optimizer = PerformanceOptimizer()
|
|
493
|
+
>>> metrics = {"lcp_seconds": 1.8, "fid_milliseconds": 45, "cls_value": 0.08}
|
|
494
|
+
>>> result = optimizer.validate_performance_metrics(metrics)
|
|
495
|
+
>>> assert result["core_web_vitals_passed"] is True
|
|
496
|
+
"""
|
|
497
|
+
|
|
498
|
+
def __init__(self) -> None:
|
|
499
|
+
"""Initialize performance optimizer."""
|
|
500
|
+
self.core_web_vitals_thresholds: Dict[str, Dict[str, float]] = {
|
|
501
|
+
"lcp": {"good": 2.5, "needs_improvement": 4.0},
|
|
502
|
+
"fid": {"good": 100, "needs_improvement": 300},
|
|
503
|
+
"cls": {"good": 0.1, "needs_improvement": 0.25},
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
def validate_code_splitting(self, strategy: Dict[str, Any]) -> Dict[str, Any]:
|
|
507
|
+
"""
|
|
508
|
+
Validate code splitting strategy.
|
|
509
|
+
|
|
510
|
+
Args:
|
|
511
|
+
strategy: Code splitting configuration
|
|
512
|
+
|
|
513
|
+
Returns:
|
|
514
|
+
Code splitting validation result
|
|
515
|
+
"""
|
|
516
|
+
chunks = strategy.get("chunks", {})
|
|
517
|
+
vendor_separated = "vendor" in chunks
|
|
518
|
+
|
|
519
|
+
return {
|
|
520
|
+
"optimized": vendor_separated and len(chunks) >= 4,
|
|
521
|
+
"chunk_count": len(chunks),
|
|
522
|
+
"vendor_chunk_separated": vendor_separated,
|
|
523
|
+
"dynamic_imports": strategy.get("dynamic_imports", 0),
|
|
524
|
+
"route_based": strategy.get("route_based_splitting", False),
|
|
525
|
+
"component_based": strategy.get("component_based_splitting", False),
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
def validate_memoization(self, strategy: Dict[str, Any]) -> Dict[str, Any]:
|
|
529
|
+
"""
|
|
530
|
+
Validate memoization optimization strategy.
|
|
531
|
+
|
|
532
|
+
Args:
|
|
533
|
+
strategy: Memoization strategy details
|
|
534
|
+
|
|
535
|
+
Returns:
|
|
536
|
+
Memoization validation result
|
|
537
|
+
"""
|
|
538
|
+
baseline = strategy.get("render_count_baseline", 1)
|
|
539
|
+
optimized = strategy.get("render_count_optimized", 1)
|
|
540
|
+
improvement = ((baseline - optimized) / baseline * 100) if baseline > 0 else 0
|
|
541
|
+
|
|
542
|
+
return {
|
|
543
|
+
"optimized": True,
|
|
544
|
+
"memo_count": len(strategy.get("memo_components", [])),
|
|
545
|
+
"hooks_used": ["useMemo", "useCallback"],
|
|
546
|
+
"improvement_percentage": improvement,
|
|
547
|
+
"baseline_renders": baseline,
|
|
548
|
+
"optimized_renders": optimized,
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
def validate_performance_metrics(self, metrics: Dict[str, Any]) -> Dict[str, Any]:
|
|
552
|
+
"""
|
|
553
|
+
Validate Core Web Vitals and performance metrics.
|
|
554
|
+
|
|
555
|
+
Args:
|
|
556
|
+
metrics: Performance metrics
|
|
557
|
+
|
|
558
|
+
Returns:
|
|
559
|
+
Metrics validation result
|
|
560
|
+
"""
|
|
561
|
+
lcp = metrics.get("lcp_seconds", 0)
|
|
562
|
+
fid = metrics.get("fid_milliseconds", 0)
|
|
563
|
+
cls = metrics.get("cls_value", 0)
|
|
564
|
+
|
|
565
|
+
def get_status(value: float, threshold_good: float) -> str:
|
|
566
|
+
return "good" if value <= threshold_good else "needs_improvement"
|
|
567
|
+
|
|
568
|
+
return {
|
|
569
|
+
"bundle_optimized": metrics.get("gzip_size_kb", 100) < 60,
|
|
570
|
+
"core_web_vitals_passed": (
|
|
571
|
+
lcp <= self.core_web_vitals_thresholds["lcp"]["good"]
|
|
572
|
+
and fid <= self.core_web_vitals_thresholds["fid"]["good"]
|
|
573
|
+
and cls <= self.core_web_vitals_thresholds["cls"]["good"]
|
|
574
|
+
),
|
|
575
|
+
"lcp_status": get_status(lcp, self.core_web_vitals_thresholds["lcp"]["good"]),
|
|
576
|
+
"fid_status": get_status(fid, self.core_web_vitals_thresholds["fid"]["good"]),
|
|
577
|
+
"cls_status": get_status(cls, self.core_web_vitals_thresholds["cls"]["good"]),
|
|
578
|
+
"metrics": {
|
|
579
|
+
"lcp": lcp,
|
|
580
|
+
"fid": fid,
|
|
581
|
+
"cls": cls,
|
|
582
|
+
"bundle_size_kb": metrics.get("bundle_size_kb", 0),
|
|
583
|
+
"gzip_size_kb": metrics.get("gzip_size_kb", 0),
|
|
584
|
+
},
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
# ============================================================================
|
|
589
|
+
# CLASS 5: Design System Builder
|
|
590
|
+
# ============================================================================
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
class DesignSystemBuilder:
|
|
594
|
+
"""
|
|
595
|
+
Builds and manages design systems with tokens and components.
|
|
596
|
+
|
|
597
|
+
Enterprise-grade design system supporting:
|
|
598
|
+
- Design token definition (colors, typography, spacing)
|
|
599
|
+
- Component documentation generation
|
|
600
|
+
- Theming and dark mode support
|
|
601
|
+
- Design consistency validation
|
|
602
|
+
- Component library management
|
|
603
|
+
|
|
604
|
+
Example:
|
|
605
|
+
>>> builder = DesignSystemBuilder()
|
|
606
|
+
>>> tokens = {"colors": {"primary": "#0ea5e9"}}
|
|
607
|
+
>>> result = builder.define_design_tokens(tokens)
|
|
608
|
+
>>> assert result["token_count"] > 0
|
|
609
|
+
"""
|
|
610
|
+
|
|
611
|
+
def __init__(self) -> None:
|
|
612
|
+
"""Initialize design system builder."""
|
|
613
|
+
self.tokens: Dict[str, Dict[str, Any]] = {}
|
|
614
|
+
self.components_doc: Dict[str, str] = {}
|
|
615
|
+
|
|
616
|
+
def define_design_tokens(self, tokens: Dict[str, Dict[str, Any]]) -> Dict[str, Any]:
|
|
617
|
+
"""
|
|
618
|
+
Define design system tokens.
|
|
619
|
+
|
|
620
|
+
Args:
|
|
621
|
+
tokens: Design tokens (colors, spacing, typography)
|
|
622
|
+
|
|
623
|
+
Returns:
|
|
624
|
+
Token definition result
|
|
625
|
+
"""
|
|
626
|
+
self.tokens = tokens
|
|
627
|
+
token_count = sum(len(v) for v in tokens.values() if isinstance(v, dict))
|
|
628
|
+
|
|
629
|
+
return {
|
|
630
|
+
"token_count": token_count,
|
|
631
|
+
"categories": list(tokens.keys()),
|
|
632
|
+
"css_variables": self._generate_css_variables(tokens),
|
|
633
|
+
"theme_support": "light_dark",
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
def _generate_css_variables(self, tokens: Dict[str, Dict[str, Any]]) -> List[str]:
|
|
637
|
+
"""Generate CSS custom properties from tokens."""
|
|
638
|
+
css_vars = []
|
|
639
|
+
for category, values in tokens.items():
|
|
640
|
+
if isinstance(values, dict):
|
|
641
|
+
for name, value in values.items():
|
|
642
|
+
css_vars.append(f"--{category}-{name}")
|
|
643
|
+
return css_vars
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
# ============================================================================
|
|
647
|
+
# CLASS 6: Responsive Layout Planner
|
|
648
|
+
# ============================================================================
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
class ResponsiveLayoutPlanner:
|
|
652
|
+
"""
|
|
653
|
+
Plans responsive layouts with mobile-first approach.
|
|
654
|
+
|
|
655
|
+
Enterprise-grade responsive design supporting:
|
|
656
|
+
- Mobile-first breakpoint strategy
|
|
657
|
+
- Fluid layout and container queries
|
|
658
|
+
- Responsive image optimization
|
|
659
|
+
- Touch-friendly interface design
|
|
660
|
+
- Cross-device testing strategy
|
|
661
|
+
|
|
662
|
+
Example:
|
|
663
|
+
>>> planner = ResponsiveLayoutPlanner()
|
|
664
|
+
>>> breakpoints = {"mobile": 0, "sm": 640, "md": 768}
|
|
665
|
+
>>> result = planner.validate_breakpoints(breakpoints)
|
|
666
|
+
>>> assert result["mobile_first"] is True
|
|
667
|
+
"""
|
|
668
|
+
|
|
669
|
+
def __init__(self):
|
|
670
|
+
"""Initialize responsive layout planner."""
|
|
671
|
+
self.standard_breakpoints = {
|
|
672
|
+
"mobile": 0,
|
|
673
|
+
"sm": 640,
|
|
674
|
+
"md": 768,
|
|
675
|
+
"lg": 1024,
|
|
676
|
+
"xl": 1280,
|
|
677
|
+
"2xl": 1536,
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
def validate_breakpoints(self, breakpoints: Dict[str, int]) -> Dict[str, Any]:
|
|
681
|
+
"""
|
|
682
|
+
Validate responsive breakpoints.
|
|
683
|
+
|
|
684
|
+
Args:
|
|
685
|
+
breakpoints: Breakpoint definitions
|
|
686
|
+
|
|
687
|
+
Returns:
|
|
688
|
+
Breakpoint validation result
|
|
689
|
+
"""
|
|
690
|
+
is_mobile_first = breakpoints.get("mobile_first", False)
|
|
691
|
+
breakpoint_count = len(breakpoints) - 1 # Exclude mobile_first flag
|
|
692
|
+
|
|
693
|
+
return {
|
|
694
|
+
"mobile_first": is_mobile_first,
|
|
695
|
+
"breakpoint_count": breakpoint_count,
|
|
696
|
+
"valid": breakpoint_count >= 4,
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
def validate_fluid_layout(self, layout_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
700
|
+
"""
|
|
701
|
+
Validate fluid layout configuration.
|
|
702
|
+
|
|
703
|
+
Args:
|
|
704
|
+
layout_config: Fluid layout settings
|
|
705
|
+
|
|
706
|
+
Returns:
|
|
707
|
+
Fluid layout validation result
|
|
708
|
+
"""
|
|
709
|
+
is_fluid = layout_config.get("container_query_enabled", False) or layout_config.get("fluid_spacing", False)
|
|
710
|
+
|
|
711
|
+
responsive_score = sum(
|
|
712
|
+
[
|
|
713
|
+
0.25 if layout_config.get("fluid_spacing") else 0,
|
|
714
|
+
0.25 if layout_config.get("responsive_typography") else 0,
|
|
715
|
+
0.25 if layout_config.get("responsive_images") else 0,
|
|
716
|
+
0.25 if layout_config.get("aspect_ratio_preserved") else 0,
|
|
717
|
+
]
|
|
718
|
+
)
|
|
719
|
+
|
|
720
|
+
return {
|
|
721
|
+
"fluid": is_fluid,
|
|
722
|
+
"container_queries_enabled": layout_config.get("container_query_enabled", False),
|
|
723
|
+
"responsive_score": responsive_score,
|
|
724
|
+
"grid_responsive": len(layout_config.get("grid_columns_responsive", {})) >= 3,
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
def validate_image_strategy(self, strategy: Dict[str, Any]) -> Dict[str, Any]:
|
|
728
|
+
"""
|
|
729
|
+
Validate responsive image strategy.
|
|
730
|
+
|
|
731
|
+
Args:
|
|
732
|
+
strategy: Image optimization strategy
|
|
733
|
+
|
|
734
|
+
Returns:
|
|
735
|
+
Image strategy validation result
|
|
736
|
+
"""
|
|
737
|
+
optimization_score = sum(
|
|
738
|
+
[
|
|
739
|
+
0.2 if strategy.get("srcset_enabled") else 0,
|
|
740
|
+
0.2 if strategy.get("lazy_loading") else 0,
|
|
741
|
+
0.2 if strategy.get("image_optimization") else 0,
|
|
742
|
+
0.2 if strategy.get("webp_format") else 0,
|
|
743
|
+
0.2 if strategy.get("placeholder_strategy") else 0,
|
|
744
|
+
]
|
|
745
|
+
)
|
|
746
|
+
|
|
747
|
+
return {
|
|
748
|
+
"optimized": optimization_score > 0.8,
|
|
749
|
+
"lazy_loading_enabled": bool(strategy.get("lazy_loading")),
|
|
750
|
+
"webp_support": strategy.get("webp_format", False),
|
|
751
|
+
"optimization_score": optimization_score,
|
|
752
|
+
"responsive_images": len(strategy.get("breakpoint_images", {})) >= 2,
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
# ============================================================================
|
|
757
|
+
# CLASS 7: Frontend Metrics Collector
|
|
758
|
+
# ============================================================================
|
|
759
|
+
|
|
760
|
+
|
|
761
|
+
@dataclass
|
|
762
|
+
class PerformanceMetrics:
|
|
763
|
+
"""Data class for frontend performance metrics."""
|
|
764
|
+
|
|
765
|
+
lcp: float # Largest Contentful Paint in seconds
|
|
766
|
+
fid: float # First Input Delay in milliseconds
|
|
767
|
+
cls: float # Cumulative Layout Shift
|
|
768
|
+
ttfb: float # Time to First Byte in milliseconds
|
|
769
|
+
fcp: float # First Contentful Paint in seconds
|
|
770
|
+
tti: float # Time to Interactive in seconds
|
|
771
|
+
bundle_size: float # Bundle size in KB
|
|
772
|
+
timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
class FrontendMetricsCollector:
|
|
776
|
+
"""
|
|
777
|
+
Collects and analyzes frontend performance metrics.
|
|
778
|
+
|
|
779
|
+
Enterprise-grade metrics supporting:
|
|
780
|
+
- Core Web Vitals tracking (LCP, FID, CLS)
|
|
781
|
+
- Custom metrics collection
|
|
782
|
+
- Performance trend analysis
|
|
783
|
+
- Real User Monitoring (RUM) integration
|
|
784
|
+
- Performance budgeting
|
|
785
|
+
|
|
786
|
+
Example:
|
|
787
|
+
>>> collector = FrontendMetricsCollector()
|
|
788
|
+
>>> metrics = PerformanceMetrics(lcp=1.8, fid=45, cls=0.08, ...)
|
|
789
|
+
>>> result = collector.analyze_metrics(metrics)
|
|
790
|
+
>>> assert result["performance_score"] > 0.7
|
|
791
|
+
"""
|
|
792
|
+
|
|
793
|
+
def __init__(self) -> None:
|
|
794
|
+
"""Initialize metrics collector."""
|
|
795
|
+
self.metrics_history: List[PerformanceMetrics] = []
|
|
796
|
+
self.thresholds = {"lcp": 2.5, "fid": 100, "cls": 0.1}
|
|
797
|
+
|
|
798
|
+
def collect_metrics(self, metrics: Dict[str, float]) -> PerformanceMetrics:
|
|
799
|
+
"""
|
|
800
|
+
Collect performance metrics.
|
|
801
|
+
|
|
802
|
+
Args:
|
|
803
|
+
metrics: Performance metrics dictionary
|
|
804
|
+
|
|
805
|
+
Returns:
|
|
806
|
+
PerformanceMetrics object
|
|
807
|
+
"""
|
|
808
|
+
perf_metrics = PerformanceMetrics(
|
|
809
|
+
lcp=metrics.get("lcp", 0),
|
|
810
|
+
fid=metrics.get("fid", 0),
|
|
811
|
+
cls=metrics.get("cls", 0),
|
|
812
|
+
ttfb=metrics.get("ttfb", 0),
|
|
813
|
+
fcp=metrics.get("fcp", 0),
|
|
814
|
+
tti=metrics.get("tti", 0),
|
|
815
|
+
bundle_size=metrics.get("bundle_size", 0),
|
|
816
|
+
)
|
|
817
|
+
self.metrics_history.append(perf_metrics)
|
|
818
|
+
return perf_metrics
|
|
819
|
+
|
|
820
|
+
def analyze_metrics(self, metrics: PerformanceMetrics) -> Dict[str, Any]:
|
|
821
|
+
"""
|
|
822
|
+
Analyze performance metrics.
|
|
823
|
+
|
|
824
|
+
Args:
|
|
825
|
+
metrics: PerformanceMetrics object
|
|
826
|
+
|
|
827
|
+
Returns:
|
|
828
|
+
Metrics analysis result
|
|
829
|
+
"""
|
|
830
|
+
lcp_good = metrics.lcp <= self.thresholds["lcp"]
|
|
831
|
+
fid_good = metrics.fid <= self.thresholds["fid"]
|
|
832
|
+
cls_good = metrics.cls <= self.thresholds["cls"]
|
|
833
|
+
|
|
834
|
+
all_good = lcp_good and fid_good and cls_good
|
|
835
|
+
|
|
836
|
+
# Calculate performance score (0-100)
|
|
837
|
+
score_components = [
|
|
838
|
+
100 if lcp_good else 50,
|
|
839
|
+
100 if fid_good else 50,
|
|
840
|
+
100 if cls_good else 50,
|
|
841
|
+
]
|
|
842
|
+
performance_score = sum(score_components) / len(score_components) / 100
|
|
843
|
+
|
|
844
|
+
return {
|
|
845
|
+
"performance_score": performance_score,
|
|
846
|
+
"core_web_vitals_pass": all_good,
|
|
847
|
+
"lcp_status": "good" if lcp_good else "needs_improvement",
|
|
848
|
+
"fid_status": "good" if fid_good else "needs_improvement",
|
|
849
|
+
"cls_status": "good" if cls_good else "needs_improvement",
|
|
850
|
+
"metrics": asdict(metrics),
|
|
851
|
+
"recommendations": self._generate_recommendations(metrics),
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
def _generate_recommendations(self, metrics: PerformanceMetrics) -> List[str]:
|
|
855
|
+
"""Generate performance improvement recommendations."""
|
|
856
|
+
recommendations = []
|
|
857
|
+
|
|
858
|
+
if metrics.lcp > self.thresholds["lcp"]:
|
|
859
|
+
recommendations.append("Optimize LCP: Improve critical resource loading")
|
|
860
|
+
|
|
861
|
+
if metrics.fid > self.thresholds["fid"]:
|
|
862
|
+
recommendations.append("Reduce FID: Break up long JavaScript tasks")
|
|
863
|
+
|
|
864
|
+
if metrics.cls > self.thresholds["cls"]:
|
|
865
|
+
recommendations.append("Fix CLS: Reserve space for dynamic content")
|
|
866
|
+
|
|
867
|
+
if metrics.bundle_size > 200:
|
|
868
|
+
recommendations.append("Reduce bundle size: Implement code splitting")
|
|
869
|
+
|
|
870
|
+
return recommendations
|