moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +4 -12
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
# Advanced shadcn/ui Component Patterns
|
|
2
|
+
|
|
3
|
+
## Architecture Patterns
|
|
4
|
+
|
|
5
|
+
### Complex Component Composition
|
|
6
|
+
|
|
7
|
+
shadcn/ui excels at composing complex UI from simple, reusable components. The architecture follows a composition-over-inheritance approach.
|
|
8
|
+
|
|
9
|
+
Pattern: Compound Components
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// Compound component pattern with shadcn/ui
|
|
13
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
|
|
14
|
+
import { Button } from "@/components/ui/button"
|
|
15
|
+
import { Input } from "@/components/ui/input"
|
|
16
|
+
import React, { createContext, useContext } from "react"
|
|
17
|
+
|
|
18
|
+
// Create a context for form state
|
|
19
|
+
interface FormContextType {
|
|
20
|
+
data: Record<string, any>
|
|
21
|
+
setData: (key: string, value: any) => void
|
|
22
|
+
errors: Record<string, string>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const FormContext = createContext<FormContextType | undefined>(undefined)
|
|
26
|
+
|
|
27
|
+
export function Form({ children, onSubmit }: { children: React.ReactNode; onSubmit: (data: any) => void }) {
|
|
28
|
+
const [data, setData] = React.useState({})
|
|
29
|
+
const [errors, setErrors] = React.useState({})
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<FormContext.Provider value={{ data, setData: (k, v) => setData(prev => ({ ...prev, [k]: v })), errors }}>
|
|
33
|
+
<form
|
|
34
|
+
onSubmit={(e) => {
|
|
35
|
+
e.preventDefault()
|
|
36
|
+
onSubmit(data)
|
|
37
|
+
}}
|
|
38
|
+
>
|
|
39
|
+
{children}
|
|
40
|
+
</form>
|
|
41
|
+
</FormContext.Provider>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function FormField({ label, name, type = "text" }: { label: string; name: string; type?: string }) {
|
|
46
|
+
const context = useContext(FormContext)
|
|
47
|
+
if (!context) throw new Error("FormField must be used inside Form")
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div className="mb-4">
|
|
51
|
+
<label htmlFor={name} className="block text-sm font-medium mb-1">
|
|
52
|
+
{label}
|
|
53
|
+
</label>
|
|
54
|
+
<Input
|
|
55
|
+
id={name}
|
|
56
|
+
type={type}
|
|
57
|
+
value={context.data[name] || ""}
|
|
58
|
+
onChange={(e) => context.setData(name, e.target.value)}
|
|
59
|
+
/>
|
|
60
|
+
</div>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Usage
|
|
65
|
+
export function MyForm() {
|
|
66
|
+
return (
|
|
67
|
+
<Form onSubmit={(data) => console.log(data)}>
|
|
68
|
+
<Card>
|
|
69
|
+
<CardHeader>
|
|
70
|
+
<CardTitle>Contact Form</CardTitle>
|
|
71
|
+
<CardDescription>Enter your details</CardDescription>
|
|
72
|
+
</CardHeader>
|
|
73
|
+
<CardContent>
|
|
74
|
+
<FormField label="Name" name="name" />
|
|
75
|
+
<FormField label="Email" name="email" type="email" />
|
|
76
|
+
<Button type="submit">Submit</Button>
|
|
77
|
+
</CardContent>
|
|
78
|
+
</Card>
|
|
79
|
+
</Form>
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Design Token Integration
|
|
85
|
+
|
|
86
|
+
shadcn/ui uses CSS variables for theming. Components automatically adapt to theme changes.
|
|
87
|
+
|
|
88
|
+
Pattern: Theme-Aware Components
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// Using design tokens in custom components
|
|
92
|
+
export function StatusBadge({ status }: { status: "success" | "error" | "warning" }) {
|
|
93
|
+
const statusConfig = {
|
|
94
|
+
success: "bg-green-500/20 text-green-700 dark:text-green-400",
|
|
95
|
+
error: "bg-red-500/20 text-red-700 dark:text-red-400",
|
|
96
|
+
warning: "bg-yellow-500/20 text-yellow-700 dark:text-yellow-400",
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<span className={`px-3 py-1 rounded-md text-sm font-medium ${statusConfig[status]}`}>
|
|
101
|
+
{status.charAt(0).toUpperCase() + status.slice(1)}
|
|
102
|
+
</span>
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Theme switching with context
|
|
107
|
+
import { useEffect, useState } from "react"
|
|
108
|
+
|
|
109
|
+
export function ThemeSwitcher() {
|
|
110
|
+
const [theme, setTheme] = useState("light")
|
|
111
|
+
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
const html = document.documentElement
|
|
114
|
+
if (theme === "dark") {
|
|
115
|
+
html.classList.add("dark")
|
|
116
|
+
} else {
|
|
117
|
+
html.classList.remove("dark")
|
|
118
|
+
}
|
|
119
|
+
}, [theme])
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<Button
|
|
123
|
+
variant="outline"
|
|
124
|
+
onClick={() => setTheme(theme === "light" ? "dark" : "light")}
|
|
125
|
+
>
|
|
126
|
+
{theme === "light" ? "" : ""}
|
|
127
|
+
</Button>
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Advanced Component Patterns
|
|
133
|
+
|
|
134
|
+
### Form Composition with Validation
|
|
135
|
+
|
|
136
|
+
shadcn/ui Button, Input, and Form components integrate well with validation libraries like react-hook-form.
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
import { useForm } from "react-hook-form"
|
|
140
|
+
import { Button } from "@/components/ui/button"
|
|
141
|
+
import { Input } from "@/components/ui/input"
|
|
142
|
+
|
|
143
|
+
interface FormData {
|
|
144
|
+
username: string
|
|
145
|
+
email: string
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function AdvancedForm() {
|
|
149
|
+
const { register, handleSubmit, formState: { errors } } = useForm<FormData>({
|
|
150
|
+
defaultValues: { username: "", email: "" }
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
const onSubmit = (data: FormData) => {
|
|
154
|
+
console.log("Form submitted:", data)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return (
|
|
158
|
+
<form onSubmit={handleSubmit(onSubmit)} className="space-y-4">
|
|
159
|
+
<div>
|
|
160
|
+
<Input
|
|
161
|
+
{...register("username", { required: "Username is required" })}
|
|
162
|
+
placeholder="Enter username"
|
|
163
|
+
/>
|
|
164
|
+
{errors.username && <p className="text-red-500 text-sm">{errors.username.message}</p>}
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<div>
|
|
168
|
+
<Input
|
|
169
|
+
{...register("email", { required: "Email is required", pattern: { value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i, message: "Invalid email" } })}
|
|
170
|
+
placeholder="Enter email"
|
|
171
|
+
type="email"
|
|
172
|
+
/>
|
|
173
|
+
{errors.email && <p className="text-red-500 text-sm">{errors.email.message}</p>}
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
<Button type="submit">Submit</Button>
|
|
177
|
+
</form>
|
|
178
|
+
)
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Complex Data Table with Sorting and Filtering
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
import { DataTable } from "@/components/ui/data-table"
|
|
186
|
+
import { Button } from "@/components/ui/button"
|
|
187
|
+
import { useReactTable, getCoreRowModel, getSortedRowModel, getFilteredRowModel } from "@tanstack/react-table"
|
|
188
|
+
|
|
189
|
+
export function UserDataTable({ users }: { users: User[] }) {
|
|
190
|
+
const [sorting, setSorting] = React.useState([])
|
|
191
|
+
const [columnFilters, setColumnFilters] = React.useState([])
|
|
192
|
+
|
|
193
|
+
const table = useReactTable({
|
|
194
|
+
data: users,
|
|
195
|
+
columns: [
|
|
196
|
+
{
|
|
197
|
+
accessorKey: "name",
|
|
198
|
+
header: "Name",
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
accessorKey: "email",
|
|
202
|
+
header: "Email",
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
getCoreRowModel: getCoreRowModel(),
|
|
206
|
+
getSortedRowModel: getSortedRowModel(),
|
|
207
|
+
getFilteredRowModel: getFilteredRowModel(),
|
|
208
|
+
state: {
|
|
209
|
+
sorting,
|
|
210
|
+
columnFilters,
|
|
211
|
+
},
|
|
212
|
+
onSortingChange: setSorting,
|
|
213
|
+
onColumnFiltersChange: setColumnFilters,
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
return (
|
|
217
|
+
<div>
|
|
218
|
+
<Button onClick={() => setColumnFilters([{ id: "name", value: "john" }])}>
|
|
219
|
+
Filter by John
|
|
220
|
+
</Button>
|
|
221
|
+
<DataTable table={table} />
|
|
222
|
+
</div>
|
|
223
|
+
)
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Component Composition Strategies
|
|
228
|
+
|
|
229
|
+
### Building Component Trees
|
|
230
|
+
|
|
231
|
+
shadcn/ui components can be nested and composed to create complex layouts.
|
|
232
|
+
|
|
233
|
+
Strategy: Hierarchical Component Structure
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
// Parent wrapper component
|
|
237
|
+
export function DashboardLayout({ children }: { children: React.ReactNode }) {
|
|
238
|
+
return (
|
|
239
|
+
<div className="grid grid-cols-4 gap-4 p-6">
|
|
240
|
+
<aside className="col-span-1">
|
|
241
|
+
<Navigation />
|
|
242
|
+
</aside>
|
|
243
|
+
<main className="col-span-3">
|
|
244
|
+
{children}
|
|
245
|
+
</main>
|
|
246
|
+
</div>
|
|
247
|
+
)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Navigation subcomponent
|
|
251
|
+
function Navigation() {
|
|
252
|
+
return (
|
|
253
|
+
<nav className="space-y-2">
|
|
254
|
+
<Button variant="ghost" className="w-full justify-start">Dashboard</Button>
|
|
255
|
+
<Button variant="ghost" className="w-full justify-start">Settings</Button>
|
|
256
|
+
<Button variant="ghost" className="w-full justify-start">Profile</Button>
|
|
257
|
+
</nav>
|
|
258
|
+
)
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Usage
|
|
262
|
+
export function Dashboard() {
|
|
263
|
+
return (
|
|
264
|
+
<DashboardLayout>
|
|
265
|
+
<Card>
|
|
266
|
+
<CardHeader>
|
|
267
|
+
<CardTitle>Welcome</CardTitle>
|
|
268
|
+
</CardHeader>
|
|
269
|
+
<CardContent>
|
|
270
|
+
Dashboard content here
|
|
271
|
+
</CardContent>
|
|
272
|
+
</Card>
|
|
273
|
+
</DashboardLayout>
|
|
274
|
+
)
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## Design System Scaling
|
|
279
|
+
|
|
280
|
+
### Managing Component Variants
|
|
281
|
+
|
|
282
|
+
shadcn/ui components support variants for different use cases.
|
|
283
|
+
|
|
284
|
+
Pattern: Variant Management
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
// Using Button variants for consistent interface
|
|
288
|
+
export function ActionButtons() {
|
|
289
|
+
return (
|
|
290
|
+
<div className="flex gap-2">
|
|
291
|
+
<Button variant="default">Primary Action</Button>
|
|
292
|
+
<Button variant="secondary">Secondary Action</Button>
|
|
293
|
+
<Button variant="outline">Outline Action</Button>
|
|
294
|
+
<Button variant="destructive">Delete</Button>
|
|
295
|
+
<Button variant="ghost">Ghost Action</Button>
|
|
296
|
+
</div>
|
|
297
|
+
)
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Creating custom size variants
|
|
301
|
+
export function SizedButtons() {
|
|
302
|
+
return (
|
|
303
|
+
<div className="flex gap-2 items-center">
|
|
304
|
+
<Button size="sm">Small</Button>
|
|
305
|
+
<Button size="default">Default</Button>
|
|
306
|
+
<Button size="lg">Large</Button>
|
|
307
|
+
</div>
|
|
308
|
+
)
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Responsive Design Patterns
|
|
313
|
+
|
|
314
|
+
### Mobile-First Approach with Tailwind
|
|
315
|
+
|
|
316
|
+
shadcn/ui uses Tailwind CSS which supports responsive breakpoints.
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
export function ResponsiveCard() {
|
|
320
|
+
return (
|
|
321
|
+
<Card className="w-full sm:max-w-sm md:max-w-md lg:max-w-lg">
|
|
322
|
+
<CardHeader className="p-4 sm:p-6">
|
|
323
|
+
<CardTitle className="text-lg sm:text-xl md:text-2xl">
|
|
324
|
+
Responsive Card
|
|
325
|
+
</CardTitle>
|
|
326
|
+
</CardHeader>
|
|
327
|
+
<CardContent className="p-4 sm:p-6">
|
|
328
|
+
<p className="text-sm sm:text-base md:text-lg">
|
|
329
|
+
Content adapts to screen size
|
|
330
|
+
</p>
|
|
331
|
+
</CardContent>
|
|
332
|
+
</Card>
|
|
333
|
+
)
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Performance Patterns
|
|
338
|
+
|
|
339
|
+
### Memoization and Lazy Loading
|
|
340
|
+
|
|
341
|
+
shadcn/ui components benefit from React.memo for preventing unnecessary re-renders.
|
|
342
|
+
|
|
343
|
+
```typescript
|
|
344
|
+
import React from "react"
|
|
345
|
+
import { Card, CardContent } from "@/components/ui/card"
|
|
346
|
+
|
|
347
|
+
interface UserCardProps {
|
|
348
|
+
user: User
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
export const UserCard = React.memo(function UserCard({ user }: UserCardProps) {
|
|
352
|
+
return (
|
|
353
|
+
<Card>
|
|
354
|
+
<CardContent>
|
|
355
|
+
<p>{user.name}</p>
|
|
356
|
+
<p className="text-gray-500">{user.email}</p>
|
|
357
|
+
</CardContent>
|
|
358
|
+
</Card>
|
|
359
|
+
)
|
|
360
|
+
})
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
## Accessibility Standards
|
|
364
|
+
|
|
365
|
+
### ARIA Integration
|
|
366
|
+
|
|
367
|
+
shadcn/ui components come with built-in accessibility features.
|
|
368
|
+
|
|
369
|
+
```typescript
|
|
370
|
+
export function AccessibleDialog() {
|
|
371
|
+
const [open, setOpen] = React.useState(false)
|
|
372
|
+
|
|
373
|
+
return (
|
|
374
|
+
<>
|
|
375
|
+
<Button onClick={() => setOpen(true)} aria-label="Open dialog">
|
|
376
|
+
Open
|
|
377
|
+
</Button>
|
|
378
|
+
{open && (
|
|
379
|
+
<div role="dialog" aria-labelledby="dialog-title" aria-modal="true">
|
|
380
|
+
<h2 id="dialog-title">Dialog Title</h2>
|
|
381
|
+
<p>Dialog content here</p>
|
|
382
|
+
<Button onClick={() => setOpen(false)}>Close</Button>
|
|
383
|
+
</div>
|
|
384
|
+
)}
|
|
385
|
+
</>
|
|
386
|
+
)
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
Version: 4.0.0
|
|
393
|
+
Last Updated: 2025-11-22
|
|
394
|
+
Status: Production Ready
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# shadcn/ui Performance Optimization
|
|
2
|
+
|
|
3
|
+
## Bundle Size Optimization
|
|
4
|
+
|
|
5
|
+
### Code Splitting Strategy
|
|
6
|
+
|
|
7
|
+
Pattern: Lazy Loading Components
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import React from "react"
|
|
11
|
+
|
|
12
|
+
// Lazy load heavy components
|
|
13
|
+
const DataTableComponent = React.lazy(() =>
|
|
14
|
+
import("@/components/data-table").then(mod => ({ default: mod.DataTable }))
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
export function Dashboard() {
|
|
18
|
+
return (
|
|
19
|
+
<React.Suspense fallback={<p>Loading...</p>}>
|
|
20
|
+
<DataTableComponent />
|
|
21
|
+
</React.Suspense>
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### CSS File Size Optimization
|
|
27
|
+
|
|
28
|
+
shadcn/ui uses Tailwind CSS. Optimize CSS output by:
|
|
29
|
+
|
|
30
|
+
1. Purging unused styles in `tailwind.config.ts`:
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
export default {
|
|
34
|
+
content: [
|
|
35
|
+
"./app//*.{js,ts,jsx,tsx}",
|
|
36
|
+
"./components//*.{js,ts,jsx,tsx}",
|
|
37
|
+
],
|
|
38
|
+
// Only include styles used in templates
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
2. Tree-shaking unused components - Import only what you need:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// GOOD: Import specific components
|
|
46
|
+
import { Button } from "@/components/ui/button"
|
|
47
|
+
import { Card } from "@/components/ui/card"
|
|
48
|
+
|
|
49
|
+
// AVOID: Importing entire component library
|
|
50
|
+
import * as UI from "@/components/ui"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Component Import Optimization
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// Optimized imports
|
|
57
|
+
import { Button } from "@/components/ui/button"
|
|
58
|
+
import { Input } from "@/components/ui/input"
|
|
59
|
+
|
|
60
|
+
function Form() {
|
|
61
|
+
return (
|
|
62
|
+
<>
|
|
63
|
+
<Input placeholder="Name" />
|
|
64
|
+
<Button>Submit</Button>
|
|
65
|
+
</>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Rendering Optimization
|
|
71
|
+
|
|
72
|
+
### React.memo for Components
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import React from "react"
|
|
76
|
+
import { Card } from "@/components/ui/card"
|
|
77
|
+
|
|
78
|
+
interface ItemProps {
|
|
79
|
+
id: string
|
|
80
|
+
title: string
|
|
81
|
+
description: string
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Prevent re-renders when props haven't changed
|
|
85
|
+
export const ListItem = React.memo(function ListItem({ id, title, description }: ItemProps) {
|
|
86
|
+
return (
|
|
87
|
+
<Card className="p-4">
|
|
88
|
+
<h3>{title}</h3>
|
|
89
|
+
<p>{description}</p>
|
|
90
|
+
</Card>
|
|
91
|
+
)
|
|
92
|
+
}, (prevProps, nextProps) => {
|
|
93
|
+
// Custom comparison
|
|
94
|
+
return prevProps.id === nextProps.id &&
|
|
95
|
+
prevProps.title === nextProps.title &&
|
|
96
|
+
prevProps.description === nextProps.description
|
|
97
|
+
})
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### useMemo for Expensive Computations
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
import React, { useMemo } from "react"
|
|
104
|
+
import { Button } from "@/components/ui/button"
|
|
105
|
+
|
|
106
|
+
interface DataTableProps {
|
|
107
|
+
rows: any[]
|
|
108
|
+
filter: string
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function DataTable({ rows, filter }: DataTableProps) {
|
|
112
|
+
// Memoize filtered results
|
|
113
|
+
const filteredRows = useMemo(() => {
|
|
114
|
+
return rows.filter(row => row.name.includes(filter))
|
|
115
|
+
}, [rows, filter])
|
|
116
|
+
|
|
117
|
+
return (
|
|
118
|
+
<div>
|
|
119
|
+
{filteredRows.map(row => (
|
|
120
|
+
<div key={row.id}>{row.name}</div>
|
|
121
|
+
))}
|
|
122
|
+
</div>
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### useCallback for Event Handlers
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
import React, { useCallback } from "react"
|
|
131
|
+
import { Button } from "@/components/ui/button"
|
|
132
|
+
|
|
133
|
+
export function Form() {
|
|
134
|
+
const handleSubmit = useCallback((e: React.FormEvent) => {
|
|
135
|
+
e.preventDefault()
|
|
136
|
+
// Expensive operation
|
|
137
|
+
}, [])
|
|
138
|
+
|
|
139
|
+
return (
|
|
140
|
+
<form onSubmit={handleSubmit}>
|
|
141
|
+
<Button type="submit">Submit</Button>
|
|
142
|
+
</form>
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Token Efficiency
|
|
148
|
+
|
|
149
|
+
### CSS Variable Optimization
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// Efficient design token usage
|
|
153
|
+
const tokenConfig = {
|
|
154
|
+
colors: {
|
|
155
|
+
primary: "hsl(var(--primary))",
|
|
156
|
+
secondary: "hsl(var(--secondary))",
|
|
157
|
+
},
|
|
158
|
+
spacing: {
|
|
159
|
+
xs: "var(--spacing-xs)",
|
|
160
|
+
sm: "var(--spacing-sm)",
|
|
161
|
+
},
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Use in components
|
|
165
|
+
export function Button() {
|
|
166
|
+
return (
|
|
167
|
+
<button className="bg-[var(--primary)] px-[var(--spacing-sm)]">
|
|
168
|
+
Click me
|
|
169
|
+
</button>
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Rendering Optimization
|
|
175
|
+
|
|
176
|
+
### Virtual Scrolling for Large Lists
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import React, { useMemo } from "react"
|
|
180
|
+
import { FixedSizeList } from "react-window"
|
|
181
|
+
import { Card } from "@/components/ui/card"
|
|
182
|
+
|
|
183
|
+
interface Item {
|
|
184
|
+
id: string
|
|
185
|
+
name: string
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export function VirtualList({ items }: { items: Item[] }) {
|
|
189
|
+
const Row = ({ index, style }: { index: number; style: React.CSSProperties }) => (
|
|
190
|
+
<div style={style}>
|
|
191
|
+
<Card className="p-2">
|
|
192
|
+
<p>{items[index].name}</p>
|
|
193
|
+
</Card>
|
|
194
|
+
</div>
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
return (
|
|
198
|
+
<FixedSizeList
|
|
199
|
+
height={600}
|
|
200
|
+
itemCount={items.length}
|
|
201
|
+
itemSize={80}
|
|
202
|
+
width="100%"
|
|
203
|
+
>
|
|
204
|
+
{Row}
|
|
205
|
+
</FixedSizeList>
|
|
206
|
+
)
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Pagination Pattern
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
import React from "react"
|
|
214
|
+
import { Button } from "@/components/ui/button"
|
|
215
|
+
import { Card } from "@/components/ui/card"
|
|
216
|
+
|
|
217
|
+
export function PaginatedList() {
|
|
218
|
+
const [page, setPage] = React.useState(1)
|
|
219
|
+
const itemsPerPage = 10
|
|
220
|
+
|
|
221
|
+
const startIndex = (page - 1) * itemsPerPage
|
|
222
|
+
const endIndex = startIndex + itemsPerPage
|
|
223
|
+
|
|
224
|
+
return (
|
|
225
|
+
<div>
|
|
226
|
+
<div className="space-y-2">
|
|
227
|
+
{/* Render only items for current page */}
|
|
228
|
+
</div>
|
|
229
|
+
<div className="flex gap-2">
|
|
230
|
+
<Button onClick={() => setPage(page - 1)} disabled={page === 1}>
|
|
231
|
+
Previous
|
|
232
|
+
</Button>
|
|
233
|
+
<span>Page {page}</span>
|
|
234
|
+
<Button onClick={() => setPage(page + 1)}>
|
|
235
|
+
Next
|
|
236
|
+
</Button>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
)
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Network Optimization
|
|
244
|
+
|
|
245
|
+
### Image Optimization with Next.js
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
import Image from "next/image"
|
|
249
|
+
|
|
250
|
+
export function OptimizedImage() {
|
|
251
|
+
return (
|
|
252
|
+
<Image
|
|
253
|
+
src="/image.jpg"
|
|
254
|
+
alt="Optimized image"
|
|
255
|
+
width={400}
|
|
256
|
+
height={300}
|
|
257
|
+
priority={false}
|
|
258
|
+
loading="lazy"
|
|
259
|
+
/>
|
|
260
|
+
)
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## Best Practices Summary
|
|
265
|
+
|
|
266
|
+
1. Lazy Load Components - Use React.lazy for non-critical components
|
|
267
|
+
2. Memoize Selectively - Don't over-memoize; profile first
|
|
268
|
+
3. Tree-shake Imports - Import specific components, not entire libraries
|
|
269
|
+
4. Optimize CSS - Configure Tailwind content properly
|
|
270
|
+
5. Virtual Scroll Large Lists - Use react-window for 1000+ items
|
|
271
|
+
6. Cache Computations - Use useMemo and useCallback judiciously
|
|
272
|
+
7. Monitor Bundle - Use bundle analyzer to identify bottlenecks
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
Version: 4.0.0
|
|
277
|
+
Last Updated: 2025-11-22
|
|
278
|
+
Token Focus: CSS file size, JavaScript bundle size, rendering performance
|