moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of moai-adk might be problematic. Click here for more details.

Files changed (378) hide show
  1. moai_adk/__init__.py +2 -5
  2. moai_adk/__main__.py +114 -82
  3. moai_adk/cli/__init__.py +6 -1
  4. moai_adk/cli/commands/__init__.py +1 -3
  5. moai_adk/cli/commands/analyze.py +5 -16
  6. moai_adk/cli/commands/doctor.py +6 -18
  7. moai_adk/cli/commands/init.py +56 -125
  8. moai_adk/cli/commands/language.py +14 -35
  9. moai_adk/cli/commands/status.py +9 -15
  10. moai_adk/cli/commands/update.py +1555 -190
  11. moai_adk/cli/prompts/init_prompts.py +112 -56
  12. moai_adk/cli/spec_status.py +263 -0
  13. moai_adk/cli/ui/__init__.py +44 -0
  14. moai_adk/cli/ui/progress.py +422 -0
  15. moai_adk/cli/ui/prompts.py +389 -0
  16. moai_adk/cli/ui/theme.py +129 -0
  17. moai_adk/cli/worktree/__init__.py +27 -0
  18. moai_adk/cli/worktree/__main__.py +31 -0
  19. moai_adk/cli/worktree/cli.py +672 -0
  20. moai_adk/cli/worktree/exceptions.py +89 -0
  21. moai_adk/cli/worktree/manager.py +490 -0
  22. moai_adk/cli/worktree/models.py +65 -0
  23. moai_adk/cli/worktree/registry.py +128 -0
  24. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  25. moai_adk/core/analysis/session_analyzer.py +17 -56
  26. moai_adk/core/claude_integration.py +26 -54
  27. moai_adk/core/command_helpers.py +10 -10
  28. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  29. moai_adk/core/config/auto_spec_config.py +5 -11
  30. moai_adk/core/config/migration.py +19 -9
  31. moai_adk/core/config/unified.py +436 -0
  32. moai_adk/core/context_manager.py +6 -12
  33. moai_adk/core/enterprise_features.py +1404 -0
  34. moai_adk/core/error_recovery_system.py +725 -112
  35. moai_adk/core/event_driven_hook_system.py +1371 -0
  36. moai_adk/core/git/__init__.py +8 -0
  37. moai_adk/core/git/branch_manager.py +3 -11
  38. moai_adk/core/git/checkpoint.py +1 -3
  39. moai_adk/core/git/conflict_detector.py +413 -0
  40. moai_adk/core/git/manager.py +91 -1
  41. moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
  42. moai_adk/core/input_validation_middleware.py +1006 -0
  43. moai_adk/core/integration/engine.py +6 -18
  44. moai_adk/core/integration/integration_tester.py +10 -9
  45. moai_adk/core/integration/utils.py +1 -1
  46. moai_adk/core/issue_creator.py +10 -28
  47. moai_adk/core/jit_context_loader.py +956 -0
  48. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  49. moai_adk/core/language_config_resolver.py +485 -0
  50. moai_adk/core/language_validator.py +28 -41
  51. moai_adk/core/mcp/setup.py +15 -12
  52. moai_adk/core/merge/__init__.py +9 -0
  53. moai_adk/core/merge/analyzer.py +481 -0
  54. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  55. moai_adk/core/migration/backup_manager.py +78 -9
  56. moai_adk/core/migration/custom_element_scanner.py +358 -0
  57. moai_adk/core/migration/file_migrator.py +8 -17
  58. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  59. moai_adk/core/migration/selective_restorer.py +470 -0
  60. moai_adk/core/migration/template_utils.py +74 -0
  61. moai_adk/core/migration/user_selection_ui.py +338 -0
  62. moai_adk/core/migration/version_detector.py +6 -10
  63. moai_adk/core/migration/version_migrator.py +3 -3
  64. moai_adk/core/performance/cache_system.py +8 -10
  65. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  66. moai_adk/core/project/checker.py +2 -4
  67. moai_adk/core/project/detector.py +1 -3
  68. moai_adk/core/project/initializer.py +135 -23
  69. moai_adk/core/project/phase_executor.py +54 -81
  70. moai_adk/core/project/validator.py +6 -12
  71. moai_adk/core/quality/trust_checker.py +9 -27
  72. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  73. moai_adk/core/robust_json_parser.py +611 -0
  74. moai_adk/core/rollback_manager.py +73 -148
  75. moai_adk/core/session_manager.py +10 -26
  76. moai_adk/core/skill_loading_system.py +579 -0
  77. moai_adk/core/spec/confidence_scoring.py +31 -100
  78. moai_adk/core/spec/ears_template_engine.py +351 -286
  79. moai_adk/core/spec/quality_validator.py +35 -69
  80. moai_adk/core/spec_status_manager.py +64 -74
  81. moai_adk/core/template/backup.py +45 -20
  82. moai_adk/core/template/config.py +112 -39
  83. moai_adk/core/template/merger.py +11 -19
  84. moai_adk/core/template/processor.py +253 -149
  85. moai_adk/core/template_engine.py +73 -40
  86. moai_adk/core/template_variable_synchronizer.py +417 -0
  87. moai_adk/core/unified_permission_manager.py +745 -0
  88. moai_adk/core/user_behavior_analytics.py +851 -0
  89. moai_adk/core/version_sync.py +429 -0
  90. moai_adk/foundation/__init__.py +56 -0
  91. moai_adk/foundation/backend.py +1027 -0
  92. moai_adk/foundation/database.py +1115 -0
  93. moai_adk/foundation/devops.py +1585 -0
  94. moai_adk/foundation/ears.py +431 -0
  95. moai_adk/foundation/frontend.py +870 -0
  96. moai_adk/foundation/git/commit_templates.py +4 -12
  97. moai_adk/foundation/git.py +376 -0
  98. moai_adk/foundation/langs.py +484 -0
  99. moai_adk/foundation/ml_ops.py +1162 -0
  100. moai_adk/foundation/testing.py +1524 -0
  101. moai_adk/foundation/trust/trust_principles.py +23 -72
  102. moai_adk/foundation/trust/validation_checklist.py +57 -162
  103. moai_adk/project/__init__.py +0 -0
  104. moai_adk/project/configuration.py +1084 -0
  105. moai_adk/project/documentation.py +566 -0
  106. moai_adk/project/schema.py +447 -0
  107. moai_adk/statusline/alfred_detector.py +1 -3
  108. moai_adk/statusline/config.py +13 -4
  109. moai_adk/statusline/enhanced_output_style_detector.py +23 -15
  110. moai_adk/statusline/main.py +51 -15
  111. moai_adk/statusline/renderer.py +104 -48
  112. moai_adk/statusline/update_checker.py +3 -9
  113. moai_adk/statusline/version_reader.py +140 -46
  114. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
  115. moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
  116. moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
  117. moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
  118. moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
  119. moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
  120. moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
  121. moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
  122. moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
  123. moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
  124. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
  125. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
  126. moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
  127. moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
  128. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  129. moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
  130. moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
  131. moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
  132. moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
  133. moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
  134. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
  135. moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
  136. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
  137. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
  138. moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
  139. moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
  140. moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
  141. moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
  142. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  143. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  144. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  145. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  146. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  147. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  148. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  149. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  150. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  151. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  152. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  153. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  154. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  155. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  156. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  157. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  158. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  159. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  160. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
  161. moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
  162. moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
  163. moai_adk/templates/.claude/settings.json +172 -0
  164. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
  165. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  166. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  167. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  168. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  169. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  170. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
  171. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
  172. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  173. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  174. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  175. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  176. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
  177. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
  178. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  179. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  180. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  181. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  182. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  183. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  184. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  185. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
  186. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  187. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  188. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  189. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  190. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  191. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  192. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
  193. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  194. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  195. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  196. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  197. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  198. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  199. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  200. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  201. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  202. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  203. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  204. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  205. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  206. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  207. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
  208. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
  209. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  210. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
  211. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  212. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  213. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  214. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  215. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  216. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  217. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  218. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  219. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
  220. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  221. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  222. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  223. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  224. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  225. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  226. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  227. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  228. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  229. moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
  230. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
  231. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
  232. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
  233. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
  234. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
  235. moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
  236. moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
  237. moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
  238. moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
  239. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
  240. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  241. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  242. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  243. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  244. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
  245. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  246. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  247. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  248. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  249. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  250. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  251. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  252. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  253. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  254. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  255. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
  256. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  257. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  258. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  259. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  260. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  261. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  262. moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
  263. moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
  264. moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
  265. moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
  266. moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
  267. moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
  268. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
  269. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  270. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  271. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  272. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
  273. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  274. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  275. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  276. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  277. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  278. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
  279. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  280. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  281. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  282. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  283. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  284. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  285. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  286. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  287. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  288. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  289. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  290. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
  291. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  292. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  293. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  294. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
  295. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  296. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  297. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  298. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  299. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  300. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  301. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
  302. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  303. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  304. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  305. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  306. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
  307. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  308. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  309. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  310. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  311. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  312. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  313. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  314. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  315. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  316. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  317. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  318. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  319. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  320. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  321. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  322. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  323. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
  324. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  325. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  326. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  327. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  328. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  329. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  330. moai_adk/templates/.git-hooks/pre-commit +103 -41
  331. moai_adk/templates/.git-hooks/pre-push +116 -21
  332. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  333. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  334. moai_adk/templates/.gitignore +184 -44
  335. moai_adk/templates/.mcp.json +7 -9
  336. moai_adk/templates/.moai/cache/personalization.json +10 -0
  337. moai_adk/templates/.moai/config/config.yaml +344 -0
  338. moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
  339. moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
  340. moai_adk/templates/.moai/config/presets/team.yaml +33 -0
  341. moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
  342. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  343. moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
  344. moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
  345. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
  346. moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
  347. moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
  348. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  349. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  350. moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
  351. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  352. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  353. moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
  354. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  355. moai_adk/templates/CLAUDE.md +382 -501
  356. moai_adk/utils/__init__.py +24 -1
  357. moai_adk/utils/banner.py +7 -10
  358. moai_adk/utils/common.py +16 -30
  359. moai_adk/utils/link_validator.py +4 -12
  360. moai_adk/utils/safe_file_reader.py +2 -6
  361. moai_adk/utils/timeout.py +160 -0
  362. moai_adk/utils/toon_utils.py +256 -0
  363. moai_adk/version.py +22 -0
  364. moai_adk-0.32.8.dist-info/METADATA +2478 -0
  365. moai_adk-0.32.8.dist-info/RECORD +396 -0
  366. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
  367. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
  368. moai_adk/cli/commands/backup.py +0 -82
  369. moai_adk/cli/commands/improve_user_experience.py +0 -348
  370. moai_adk/cli/commands/migrate.py +0 -158
  371. moai_adk/cli/commands/validate_links.py +0 -118
  372. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
  373. moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
  374. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
  375. moai_adk/utils/user_experience.py +0 -531
  376. moai_adk-0.25.4.dist-info/METADATA +0 -2279
  377. moai_adk-0.25.4.dist-info/RECORD +0 -112
  378. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,576 @@
1
+ ---
2
+ name: moai-workflow-testing/advanced-patterns
3
+ description: Advanced Playwright patterns for enterprise web testing, visual regression, E2E orchestration
4
+ ---
5
+
6
+ # Advanced Playwright Testing Patterns (v5.0.0)
7
+
8
+ ## Visual Regression Testing Strategies
9
+
10
+ ### 1. Screenshot-Based Regression Testing
11
+
12
+ ```typescript
13
+ import { test, expect } from '@playwright/test';
14
+
15
+ test.describe('Visual Regression Tests', () => {
16
+ test('homepage visual consistency', async ({ page }) => {
17
+ await page.goto('https://example.com');
18
+
19
+ // Take full page screenshot
20
+ await expect(page).toHaveScreenshot('homepage.png', {
21
+ fullPage: true,
22
+ timeout: 5000,
23
+ animations: 'disabled'
24
+ });
25
+ });
26
+
27
+ test('component visual regression - header', async ({ page }) => {
28
+ await page.goto('https://example.com');
29
+
30
+ const header = page.locator('header');
31
+
32
+ // Component-specific screenshot
33
+ await expect(header).toHaveScreenshot('header-component.png', {
34
+ mask: [page.locator('nav a')] // Mask dynamic elements
35
+ });
36
+ });
37
+
38
+ test('responsive visual regression', async ({ page }) => {
39
+ const breakpoints = [
40
+ { name: 'mobile', width: 375, height: 812 },
41
+ { name: 'tablet', width: 768, height: 1024 },
42
+ { name: 'desktop', width: 1920, height: 1080 }
43
+ ];
44
+
45
+ for (const breakpoint of breakpoints) {
46
+ await page.setViewportSize(breakpoint);
47
+ await page.goto('https://example.com');
48
+
49
+ await expect(page).toHaveScreenshot(
50
+ `homepage-${breakpoint.name}.png`,
51
+ { fullPage: true }
52
+ );
53
+ }
54
+ });
55
+
56
+ test('dark mode visual consistency', async ({ page }) => {
57
+ // Set dark mode preference
58
+ await page.emulateMedia({ colorScheme: 'dark' });
59
+ await page.goto('https://example.com');
60
+
61
+ await expect(page).toHaveScreenshot('homepage-dark-mode.png');
62
+ });
63
+ });
64
+ ```
65
+
66
+ ### 2. Pixel-Perfect Diff Analysis
67
+
68
+ ```typescript
69
+ class VisualRegressionAnalyzer {
70
+ async analyzeScreenshotDiff(
71
+ baseline: Buffer,
72
+ current: Buffer
73
+ ): Promise<DiffAnalysis> {
74
+ const pixelsChanged = this.calculatePixelDifference(baseline, current);
75
+
76
+ return {
77
+ totalPixels: baseline.length,
78
+ changedPixels: pixelsChanged,
79
+ percentageChange: (pixelsChanged / baseline.length) * 100,
80
+ severity: this.classifyDifference(pixelsChanged),
81
+ regions: this.identifyChangedRegions(baseline, current),
82
+ recommendations: this.generateRecommendations(pixelsChanged)
83
+ };
84
+ }
85
+
86
+ private classifyDifference(changedPixels: number): string {
87
+ if (changedPixels === 0) return 'IDENTICAL';
88
+ if (changedPixels < 1000) return 'MINOR';
89
+ if (changedPixels < 10000) return 'MODERATE';
90
+ return 'MAJOR';
91
+ }
92
+
93
+ private identifyChangedRegions(
94
+ baseline: Buffer,
95
+ current: Buffer
96
+ ): ChangedRegion[] {
97
+ // Use image processing to identify changed regions
98
+ const regions: ChangedRegion[] = [];
99
+ const diff = this.pixelDiff(baseline, current);
100
+
101
+ // Find contiguous regions of differences
102
+ for (const region of this.findContiguousRegions(diff)) {
103
+ regions.push({
104
+ x: region.x,
105
+ y: region.y,
106
+ width: region.width,
107
+ height: region.height,
108
+ confidence: region.confidence
109
+ });
110
+ }
111
+
112
+ return regions;
113
+ }
114
+
115
+ private generateRecommendations(changedPixels: number): string[] {
116
+ const recommendations: string[] = [];
117
+
118
+ if (changedPixels > 50000) {
119
+ recommendations.push('REJECT: Significant visual changes detected');
120
+ recommendations.push('Recommendation: Verify design changes with design team');
121
+ } else if (changedPixels > 10000) {
122
+ recommendations.push('REVIEW: Moderate visual changes detected');
123
+ recommendations.push('Recommendation: Manual review recommended before merge');
124
+ } else {
125
+ recommendations.push('APPROVE: Minor visual changes detected');
126
+ recommendations.push('Recommendation: OK to auto-approve if expected');
127
+ }
128
+
129
+ return recommendations;
130
+ }
131
+ }
132
+ ```
133
+
134
+ ## Advanced Playwright Patterns
135
+
136
+ ### 1. Page Object Model (POM) with Advanced Features
137
+
138
+ ```typescript
139
+ // Base page object class
140
+ class BasePage {
141
+ constructor(protected page: Page) {}
142
+
143
+ async goto(url: string) {
144
+ await this.page.goto(url, { waitUntil: 'networkidle' });
145
+ }
146
+
147
+ async waitForElement(selector: string, timeout = 5000) {
148
+ await this.page.waitForSelector(selector, { timeout });
149
+ }
150
+
151
+ async fillForm(formData: Record<string, string>) {
152
+ for (const [selector, value] of Object.entries(formData)) {
153
+ await this.page.fill(selector, value);
154
+ }
155
+ }
156
+
157
+ async clickAndWaitForNavigation(selector: string) {
158
+ await Promise.all([
159
+ this.page.waitForNavigation({ waitUntil: 'networkidle' }),
160
+ this.page.click(selector)
161
+ ]);
162
+ }
163
+
164
+ async handleDialog(action: 'accept' | 'dismiss', text?: string) {
165
+ this.page.on('dialog', async (dialog) => {
166
+ if (action === 'accept') {
167
+ await dialog.accept(text);
168
+ } else {
169
+ await dialog.dismiss();
170
+ }
171
+ });
172
+ }
173
+ }
174
+
175
+ // Specific page object
176
+ class LoginPage extends BasePage {
177
+ // Selectors
178
+ private emailInput = 'input[type="email"]';
179
+ private passwordInput = 'input[type="password"]';
180
+ private loginButton = 'button:has-text("Login")';
181
+ private errorMessage = '.error-message';
182
+
183
+ async login(email: string, password: string) {
184
+ await this.page.fill(this.emailInput, email);
185
+ await this.page.fill(this.passwordInput, password);
186
+ await this.page.click(this.loginButton);
187
+ await this.page.waitForNavigation({ waitUntil: 'networkidle' });
188
+ }
189
+
190
+ async getErrorMessage(): Promise<string> {
191
+ return this.page.locator(this.errorMessage).textContent();
192
+ }
193
+
194
+ async isErrorMessageVisible(): Promise<boolean> {
195
+ return this.page.locator(this.errorMessage).isVisible();
196
+ }
197
+ }
198
+
199
+ // Usage in test
200
+ test('login with valid credentials', async ({ page }) => {
201
+ const loginPage = new LoginPage(page);
202
+ await loginPage.goto('https://example.com/login');
203
+ await loginPage.login('user@example.com', 'password123');
204
+
205
+ // Navigate to dashboard
206
+ expect(page.url()).toContain('/dashboard');
207
+ });
208
+ ```
209
+
210
+ ### 2. Intelligent Wait Strategies
211
+
212
+ ```typescript
213
+ class SmartWaitManager {
214
+ constructor(private page: Page) {}
215
+
216
+ async waitForAPI(method: 'GET' | 'POST' | 'PUT', urlPattern: RegExp) {
217
+ const response = await this.page.waitForResponse(
218
+ (response) => response.request().method() === method &&
219
+ urlPattern.test(response.url())
220
+ );
221
+ return response.json();
222
+ }
223
+
224
+ async waitForMultipleRequests(patterns: { method: string; url: RegExp }[]) {
225
+ const responses = await Promise.all(
226
+ patterns.map(pattern =>
227
+ this.page.waitForResponse(response =>
228
+ response.request().method() === pattern.method &&
229
+ pattern.url.test(response.url())
230
+ )
231
+ )
232
+ );
233
+ return responses;
234
+ }
235
+
236
+ async waitForNetworkIdle(timeout = 5000) {
237
+ // Wait for network to be completely idle
238
+ let activeRequests = 0;
239
+ let lastRequestTime = Date.now();
240
+
241
+ this.page.on('request', () => {
242
+ activeRequests++;
243
+ lastRequestTime = Date.now();
244
+ });
245
+
246
+ this.page.on('response', () => {
247
+ activeRequests--;
248
+ });
249
+
250
+ while (Date.now() - lastRequestTime < timeout || activeRequests > 0) {
251
+ await this.page.waitForTimeout(100);
252
+ }
253
+ }
254
+
255
+ async waitForStateChange(selector: string, expectedState: string) {
256
+ await this.page.waitForFunction(
257
+ (selector, state) => {
258
+ const element = document.querySelector(selector);
259
+ return element?.getAttribute('data-state') === state;
260
+ },
261
+ [selector, expectedState],
262
+ { timeout: 5000 }
263
+ );
264
+ }
265
+ }
266
+ ```
267
+
268
+ ### 3. API Request/Response Interception
269
+
270
+ ```typescript
271
+ class APIInterceptor {
272
+ constructor(private page: Page) {}
273
+
274
+ async mockAPI(
275
+ urlPattern: RegExp,
276
+ responseData: any,
277
+ statusCode = 200
278
+ ) {
279
+ await this.page.route(urlPattern, (route) => {
280
+ route.abort('aborted');
281
+ route.continue();
282
+ });
283
+
284
+ // Intercept and mock response
285
+ await this.page.route(urlPattern, (route) => {
286
+ route.fulfill({
287
+ status: statusCode,
288
+ contentType: 'application/json',
289
+ body: JSON.stringify(responseData)
290
+ });
291
+ });
292
+ }
293
+
294
+ async recordAPITraffic(): Promise<APICall[]> {
295
+ const apiCalls: APICall[] = [];
296
+
297
+ this.page.on('response', async (response) => {
298
+ if (response.request().resourceType() === 'xhr' ||
299
+ response.request().resourceType() === 'fetch') {
300
+ apiCalls.push({
301
+ method: response.request().method(),
302
+ url: response.url(),
303
+ statusCode: response.status(),
304
+ headers: response.headers(),
305
+ body: await response.json().catch(() => null),
306
+ timestamp: new Date()
307
+ });
308
+ }
309
+ });
310
+
311
+ return apiCalls;
312
+ }
313
+
314
+ async validateAPIContract(
315
+ endpoint: string,
316
+ expectedSchema: object
317
+ ): Promise<boolean> {
318
+ const apiCalls = await this.recordAPITraffic();
319
+ const call = apiCalls.find(c => c.url.includes(endpoint));
320
+
321
+ if (!call) return false;
322
+
323
+ return this.validateAgainstSchema(call.body, expectedSchema);
324
+ }
325
+ }
326
+ ```
327
+
328
+ ## Cross-Browser Testing Orchestration
329
+
330
+ ### 1. Distributed Cross-Browser Testing
331
+
332
+ ```typescript
333
+ import { defineConfig, devices } from '@playwright/test';
334
+
335
+ export default defineConfig({
336
+ testDir: './tests',
337
+
338
+ // Parallel execution across browsers
339
+ workers: 4,
340
+
341
+ use: {
342
+ baseURL: 'http://localhost:3000',
343
+ trace: 'on-first-retry',
344
+ screenshot: 'only-on-failure',
345
+ video: 'retain-on-failure'
346
+ },
347
+
348
+ projects: [
349
+ {
350
+ name: 'chromium',
351
+ use: { ...devices['Desktop Chrome'] }
352
+ },
353
+ {
354
+ name: 'firefox',
355
+ use: { ...devices['Desktop Firefox'] }
356
+ },
357
+ {
358
+ name: 'webkit',
359
+ use: { ...devices['Desktop Safari'] }
360
+ },
361
+ {
362
+ name: 'mobile-chrome',
363
+ use: { ...devices['Pixel 5'] }
364
+ },
365
+ {
366
+ name: 'mobile-safari',
367
+ use: { ...devices['iPhone 12'] }
368
+ },
369
+ {
370
+ name: 'tablet',
371
+ use: { ...devices['iPad Pro'] }
372
+ }
373
+ ]
374
+ });
375
+ ```
376
+
377
+ ### 2. Browser-Specific Test Adjustment
378
+
379
+ ```typescript
380
+ test.describe('Cross-browser compatibility', () => {
381
+ test.beforeEach(async ({ browser, page }) => {
382
+ const browserName = browser.browserType().name();
383
+
384
+ // Browser-specific setup
385
+ if (browserName === 'webkit') {
386
+ // Safari-specific handling
387
+ await page.addInitScript(() => {
388
+ // Polyfills for Safari
389
+ if (!window.Promise) {
390
+ console.warn('Promise not supported');
391
+ }
392
+ });
393
+ } else if (browserName === 'firefox') {
394
+ // Firefox-specific setup
395
+ }
396
+ });
397
+
398
+ test('form submission works in all browsers', async ({ page, browserName }) => {
399
+ await page.goto('/form');
400
+ await page.fill('input[name="email"]', 'test@example.com');
401
+ await page.fill('input[name="message"]', 'Test message');
402
+
403
+ // Browser-specific selector adjustments
404
+ const submitSelector = browserName === 'webkit'
405
+ ? 'button:visible:text("Submit")'
406
+ : 'button[type="submit"]';
407
+
408
+ await page.click(submitSelector);
409
+
410
+ // Verify success
411
+ if (browserName === 'firefox') {
412
+ // Firefox-specific verification
413
+ await page.waitForNavigation({ timeout: 3000 });
414
+ } else {
415
+ await page.waitForSelector('.success-message');
416
+ }
417
+ });
418
+ });
419
+ ```
420
+
421
+ ## Performance Testing with Playwright
422
+
423
+ ### 1. Lighthouse Integration
424
+
425
+ ```typescript
426
+ import { playAudit } from 'playwright-lighthouse';
427
+
428
+ test('performance metrics', async ({ page }) => {
429
+ await playAudit({
430
+ page: page,
431
+ port: 9222,
432
+ thresholds: {
433
+ performance: 75,
434
+ accessibility: 80,
435
+ 'best-practices': 85,
436
+ seo: 90
437
+ },
438
+ reports: {
439
+ formats: {
440
+ json: './lighthouse-report.json',
441
+ html: './lighthouse-report.html'
442
+ },
443
+ directory: './lighthouse'
444
+ }
445
+ });
446
+ });
447
+ ```
448
+
449
+ ### 2. Custom Performance Metrics
450
+
451
+ ```typescript
452
+ class PerformanceMonitor {
453
+ async collectMetrics(page: Page): Promise<PerformanceMetrics> {
454
+ const metrics = await page.evaluate(() => {
455
+ const navigation = performance.getEntriesByType('navigation')[0];
456
+ const paintEntries = performance.getEntriesByType('paint');
457
+
458
+ return {
459
+ // Core Web Vitals
460
+ FCP: paintEntries.find(e => e.name === 'first-contentful-paint')?.startTime || 0,
461
+ LCP: performance.getEntriesByType('largest-contentful-paint').pop()?.startTime || 0,
462
+ CLS: Math.round(performance.getEntriesByType('layout-shift')
463
+ .reduce((sum, entry) => sum + (entry as any).value, 0) * 100) / 100,
464
+
465
+ // Navigation timing
466
+ domContentLoaded: navigation.domContentLoadedEventEnd - navigation.domContentLoadedEventStart,
467
+ loadComplete: navigation.loadEventEnd - navigation.loadEventStart,
468
+
469
+ // Resource timing
470
+ totalResourceTime: performance.getEntriesByType('resource')
471
+ .reduce((sum, entry) => sum + (entry as any).duration, 0)
472
+ };
473
+ });
474
+
475
+ return metrics;
476
+ }
477
+
478
+ async compareMetrics(baseline: PerformanceMetrics, current: PerformanceMetrics) {
479
+ const comparison = {
480
+ FCP: this.calculateChange(baseline.FCP, current.FCP),
481
+ LCP: this.calculateChange(baseline.LCP, current.LCP),
482
+ CLS: this.calculateChange(baseline.CLS, current.CLS)
483
+ };
484
+
485
+ // Alert if degradation > 10%
486
+ if (comparison.LCP.percentageChange > 10) {
487
+ console.warn('LCP degradation detected:', comparison.LCP);
488
+ }
489
+
490
+ return comparison;
491
+ }
492
+
493
+ private calculateChange(baseline: number, current: number) {
494
+ return {
495
+ baseline,
496
+ current,
497
+ absoluteChange: current - baseline,
498
+ percentageChange: ((current - baseline) / baseline) * 100
499
+ };
500
+ }
501
+ }
502
+ ```
503
+
504
+ ## Accessibility Testing
505
+
506
+ ### 1. Automated Accessibility Checks
507
+
508
+ ```typescript
509
+ import { injectAxe, checkA11y } from 'axe-playwright';
510
+
511
+ test('accessibility compliance', async ({ page }) => {
512
+ await page.goto('https://example.com');
513
+
514
+ // Inject axe accessibility testing library
515
+ await injectAxe(page);
516
+
517
+ // Check for violations
518
+ await checkA11y(
519
+ page,
520
+ null, // Target all elements
521
+ {
522
+ detailedReport: true,
523
+ detailedReportOptions: {
524
+ html: true
525
+ }
526
+ }
527
+ );
528
+ });
529
+
530
+ test('WCAG 2.1 AA compliance', async ({ page }) => {
531
+ await page.goto('https://example.com');
532
+ await injectAxe(page);
533
+
534
+ const accessibility = await page.evaluate(() => {
535
+ return (window as any).axe.run({
536
+ standards: 'wcag21aa',
537
+ resultTypes: ['violations', 'incomplete']
538
+ });
539
+ });
540
+
541
+ // Assert no violations
542
+ expect(accessibility.violations).toHaveLength(0);
543
+
544
+ // Review incomplete items
545
+ for (const incomplete of accessibility.incomplete) {
546
+ console.log(`Needs manual review: ${incomplete.id}`);
547
+ }
548
+ });
549
+ ```
550
+
551
+ ### 2. Keyboard Navigation Testing
552
+
553
+ ```typescript
554
+ test('keyboard navigation', async ({ page }) => {
555
+ await page.goto('https://example.com');
556
+
557
+ // Navigate using Tab key
558
+ await page.keyboard.press('Tab');
559
+ let activeElement = await page.evaluate(() => document.activeElement?.tagName);
560
+ expect(['A', 'BUTTON', 'INPUT']).toContain(activeElement);
561
+
562
+ // Test keyboard shortcuts
563
+ await page.keyboard.press('Control+K'); // Search shortcut
564
+ const searchBox = page.locator('input[aria-label="Search"]');
565
+ expect(await searchBox.isVisible()).toBe(true);
566
+
567
+ // Test Escape key closes modals
568
+ await page.keyboard.press('Escape');
569
+ const modal = page.locator('[role="dialog"]');
570
+ expect(await modal.isVisible()).toBe(false);
571
+ });
572
+ ```
573
+
574
+ ---
575
+
576
+ Version: 5.0.0 | Last Updated: 2025-11-22 | Enterprise Ready: