moai-adk 0.35.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -0
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +1 -0
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +605 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +24 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,672 @@
|
|
|
1
|
+
# Swift Development Reference
|
|
2
|
+
|
|
3
|
+
## Platform Version Matrix
|
|
4
|
+
|
|
5
|
+
### Swift 6.0 (iOS 18+, macOS 15+)
|
|
6
|
+
- Release: September 2025
|
|
7
|
+
- Xcode: 16.0+
|
|
8
|
+
- Minimum Deployment: iOS 15.0+ (recommended iOS 17.0+)
|
|
9
|
+
- Key Features:
|
|
10
|
+
- Complete data-race safety by default
|
|
11
|
+
- Typed throws for precise error handling
|
|
12
|
+
- Custom actor executors for concurrency control
|
|
13
|
+
- Embedded Swift for IoT and embedded systems
|
|
14
|
+
- Improved C++ interoperability
|
|
15
|
+
|
|
16
|
+
### Swift 5.10 (iOS 17+, macOS 14+)
|
|
17
|
+
- Release: March 2024
|
|
18
|
+
- Xcode: 15.3+
|
|
19
|
+
- Key Features:
|
|
20
|
+
- Complete strict concurrency checking
|
|
21
|
+
- @Observable macro
|
|
22
|
+
- NavigationStack improvements
|
|
23
|
+
- Swift macros
|
|
24
|
+
|
|
25
|
+
## Context7 Library Mappings
|
|
26
|
+
|
|
27
|
+
### Core Swift Libraries
|
|
28
|
+
```
|
|
29
|
+
/apple/swift - Swift language and standard library
|
|
30
|
+
/apple/swift-package-manager - SwiftPM package management
|
|
31
|
+
/apple/swift-nio - Non-blocking I/O framework
|
|
32
|
+
/apple/swift-async-algorithms - Async sequence algorithms
|
|
33
|
+
/apple/swift-collections - Additional collection types
|
|
34
|
+
/apple/swift-algorithms - Sequence/collection algorithms
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Networking Libraries
|
|
38
|
+
```
|
|
39
|
+
/Alamofire/Alamofire - HTTP networking library
|
|
40
|
+
/Moya/Moya - Network abstraction layer
|
|
41
|
+
/kean/Nuke - Image loading and caching
|
|
42
|
+
/onevcat/Kingfisher - Image downloading and caching
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Database Libraries
|
|
46
|
+
```
|
|
47
|
+
/realm/realm-swift - Mobile database
|
|
48
|
+
/groue/GRDB.swift - SQLite toolkit
|
|
49
|
+
/stephencelis/SQLite.swift - Type-safe SQLite wrapper
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Architecture Libraries
|
|
53
|
+
```
|
|
54
|
+
/pointfreeco/swift-composable-architecture - TCA architecture
|
|
55
|
+
/ReactiveX/RxSwift - Reactive programming
|
|
56
|
+
/CombineCommunity/CombineExt - Combine extensions
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Testing Libraries
|
|
60
|
+
```
|
|
61
|
+
/Quick/Quick - BDD testing framework
|
|
62
|
+
/Quick/Nimble - Matcher framework
|
|
63
|
+
/pointfreeco/swift-snapshot-testing - Snapshot testing
|
|
64
|
+
/nalexn/ViewInspector - SwiftUI view testing
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### UI Libraries
|
|
68
|
+
```
|
|
69
|
+
/SnapKit/SnapKit - Auto Layout DSL
|
|
70
|
+
/airbnb/lottie-ios - Animation library
|
|
71
|
+
/danielgindi/Charts - Charting library
|
|
72
|
+
/SwiftUIX/SwiftUIX - SwiftUI extensions
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Architecture Patterns
|
|
76
|
+
|
|
77
|
+
### SwiftUI + TCA (The Composable Architecture)
|
|
78
|
+
|
|
79
|
+
Feature Definition:
|
|
80
|
+
```swift
|
|
81
|
+
import ComposableArchitecture
|
|
82
|
+
|
|
83
|
+
@Reducer
|
|
84
|
+
struct UserFeature {
|
|
85
|
+
@ObservableState
|
|
86
|
+
struct State: Equatable {
|
|
87
|
+
var user: User?
|
|
88
|
+
var isLoading = false
|
|
89
|
+
var error: String?
|
|
90
|
+
@Presents var alert: AlertState<Action.Alert>?
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
enum Action: BindableAction {
|
|
94
|
+
case binding(BindingAction<State>)
|
|
95
|
+
case loadUser(String)
|
|
96
|
+
case userLoaded(Result<User, Error>)
|
|
97
|
+
case logout
|
|
98
|
+
case alert(PresentationAction<Alert>)
|
|
99
|
+
|
|
100
|
+
enum Alert: Equatable {
|
|
101
|
+
case confirmLogout
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@Dependency(\.userClient) var userClient
|
|
106
|
+
@Dependency(\.mainQueue) var mainQueue
|
|
107
|
+
|
|
108
|
+
var body: some ReducerOf<Self> {
|
|
109
|
+
BindingReducer()
|
|
110
|
+
Reduce { state, action in
|
|
111
|
+
switch action {
|
|
112
|
+
case .binding:
|
|
113
|
+
return .none
|
|
114
|
+
|
|
115
|
+
case let .loadUser(id):
|
|
116
|
+
state.isLoading = true
|
|
117
|
+
state.error = nil
|
|
118
|
+
return .run { send in
|
|
119
|
+
await send(.userLoaded(
|
|
120
|
+
Result { try await userClient.fetch(id) }
|
|
121
|
+
))
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
case let .userLoaded(.success(user)):
|
|
125
|
+
state.isLoading = false
|
|
126
|
+
state.user = user
|
|
127
|
+
return .none
|
|
128
|
+
|
|
129
|
+
case let .userLoaded(.failure(error)):
|
|
130
|
+
state.isLoading = false
|
|
131
|
+
state.error = error.localizedDescription
|
|
132
|
+
return .none
|
|
133
|
+
|
|
134
|
+
case .logout:
|
|
135
|
+
state.alert = AlertState {
|
|
136
|
+
TextState("Confirm Logout")
|
|
137
|
+
} actions: {
|
|
138
|
+
ButtonState(role: .destructive, action: .confirmLogout) {
|
|
139
|
+
TextState("Logout")
|
|
140
|
+
}
|
|
141
|
+
ButtonState(role: .cancel) {
|
|
142
|
+
TextState("Cancel")
|
|
143
|
+
}
|
|
144
|
+
} message: {
|
|
145
|
+
TextState("Are you sure you want to logout?")
|
|
146
|
+
}
|
|
147
|
+
return .none
|
|
148
|
+
|
|
149
|
+
case .alert(.presented(.confirmLogout)):
|
|
150
|
+
state.user = nil
|
|
151
|
+
return .none
|
|
152
|
+
|
|
153
|
+
case .alert:
|
|
154
|
+
return .none
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
.ifLet(\.$alert, action: \.alert)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
View Implementation:
|
|
163
|
+
```swift
|
|
164
|
+
struct UserView: View {
|
|
165
|
+
@Bindable var store: StoreOf<UserFeature>
|
|
166
|
+
|
|
167
|
+
var body: some View {
|
|
168
|
+
WithPerceptionTracking {
|
|
169
|
+
content
|
|
170
|
+
.task { store.send(.loadUser("current")) }
|
|
171
|
+
.alert($store.scope(state: \.alert, action: \.alert))
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@ViewBuilder
|
|
176
|
+
private var content: some View {
|
|
177
|
+
if store.isLoading {
|
|
178
|
+
ProgressView()
|
|
179
|
+
} else if let error = store.error {
|
|
180
|
+
ErrorView(message: error) {
|
|
181
|
+
store.send(.loadUser("current"))
|
|
182
|
+
}
|
|
183
|
+
} else if let user = store.user {
|
|
184
|
+
UserProfileContent(user: user) {
|
|
185
|
+
store.send(.logout)
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### MVVM with @Observable
|
|
193
|
+
|
|
194
|
+
ViewModel Pattern:
|
|
195
|
+
```swift
|
|
196
|
+
@Observable
|
|
197
|
+
@MainActor
|
|
198
|
+
final class PostListViewModel {
|
|
199
|
+
private(set) var posts: [Post] = []
|
|
200
|
+
private(set) var isLoading = false
|
|
201
|
+
private(set) var error: Error?
|
|
202
|
+
private(set) var hasMorePages = true
|
|
203
|
+
|
|
204
|
+
private var currentPage = 1
|
|
205
|
+
private let pageSize = 20
|
|
206
|
+
private let postService: PostServiceProtocol
|
|
207
|
+
|
|
208
|
+
init(postService: PostServiceProtocol) {
|
|
209
|
+
self.postService = postService
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
func loadPosts() async {
|
|
213
|
+
guard !isLoading else { return }
|
|
214
|
+
|
|
215
|
+
isLoading = true
|
|
216
|
+
error = nil
|
|
217
|
+
currentPage = 1
|
|
218
|
+
|
|
219
|
+
do {
|
|
220
|
+
let result = try await postService.fetchPosts(page: currentPage, limit: pageSize)
|
|
221
|
+
posts = result.posts
|
|
222
|
+
hasMorePages = result.hasMore
|
|
223
|
+
} catch {
|
|
224
|
+
self.error = error
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
isLoading = false
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
func loadMoreIfNeeded(currentItem: Post?) async {
|
|
231
|
+
guard let item = currentItem,
|
|
232
|
+
!isLoading,
|
|
233
|
+
hasMorePages else { return }
|
|
234
|
+
|
|
235
|
+
let thresholdIndex = posts.index(posts.endIndex, offsetBy: -5)
|
|
236
|
+
guard posts.firstIndex(where: { $0.id == item.id }) ?? 0 >= thresholdIndex else {
|
|
237
|
+
return
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
await loadNextPage()
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
private func loadNextPage() async {
|
|
244
|
+
isLoading = true
|
|
245
|
+
currentPage += 1
|
|
246
|
+
|
|
247
|
+
do {
|
|
248
|
+
let result = try await postService.fetchPosts(page: currentPage, limit: pageSize)
|
|
249
|
+
posts.append(contentsOf: result.posts)
|
|
250
|
+
hasMorePages = result.hasMore
|
|
251
|
+
} catch {
|
|
252
|
+
currentPage -= 1
|
|
253
|
+
self.error = error
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
isLoading = false
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
View with Pagination:
|
|
262
|
+
```swift
|
|
263
|
+
struct PostListView: View {
|
|
264
|
+
@State private var viewModel: PostListViewModel
|
|
265
|
+
|
|
266
|
+
init(postService: PostServiceProtocol) {
|
|
267
|
+
_viewModel = State(initialValue: PostListViewModel(postService: postService))
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
var body: some View {
|
|
271
|
+
NavigationStack {
|
|
272
|
+
List {
|
|
273
|
+
ForEach(viewModel.posts) { post in
|
|
274
|
+
PostRow(post: post)
|
|
275
|
+
.task {
|
|
276
|
+
await viewModel.loadMoreIfNeeded(currentItem: post)
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if viewModel.isLoading {
|
|
281
|
+
HStack {
|
|
282
|
+
Spacer()
|
|
283
|
+
ProgressView()
|
|
284
|
+
Spacer()
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
.refreshable {
|
|
289
|
+
await viewModel.loadPosts()
|
|
290
|
+
}
|
|
291
|
+
.task {
|
|
292
|
+
await viewModel.loadPosts()
|
|
293
|
+
}
|
|
294
|
+
.navigationTitle("Posts")
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Concurrency Deep Dive
|
|
301
|
+
|
|
302
|
+
### Custom Actor Executors
|
|
303
|
+
|
|
304
|
+
Serial Executor for Background Processing:
|
|
305
|
+
```swift
|
|
306
|
+
actor BackgroundProcessor {
|
|
307
|
+
private let executor: SerialDispatchQueueExecutor
|
|
308
|
+
|
|
309
|
+
nonisolated var unownedExecutor: UnownedSerialExecutor {
|
|
310
|
+
executor.asUnownedSerialExecutor()
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
init(label: String) {
|
|
314
|
+
executor = SerialDispatchQueueExecutor(
|
|
315
|
+
queue: DispatchQueue(label: label, qos: .background)
|
|
316
|
+
)
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
func processHeavyTask(_ data: Data) async throws -> ProcessedResult {
|
|
320
|
+
// This runs on the background queue
|
|
321
|
+
let result = try JSONDecoder().decode(RawData.self, from: data)
|
|
322
|
+
return ProcessedResult(from: result)
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
final class SerialDispatchQueueExecutor: SerialExecutor {
|
|
327
|
+
let queue: DispatchQueue
|
|
328
|
+
|
|
329
|
+
init(queue: DispatchQueue) {
|
|
330
|
+
self.queue = queue
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
func enqueue(_ job: consuming ExecutorJob) {
|
|
334
|
+
let unownedJob = UnownedJob(job)
|
|
335
|
+
queue.async {
|
|
336
|
+
unownedJob.runSynchronously(on: self.asUnownedSerialExecutor())
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### AsyncSequence Patterns
|
|
343
|
+
|
|
344
|
+
Custom AsyncSequence:
|
|
345
|
+
```swift
|
|
346
|
+
struct AsyncTimerSequence: AsyncSequence {
|
|
347
|
+
typealias Element = Date
|
|
348
|
+
|
|
349
|
+
let interval: TimeInterval
|
|
350
|
+
|
|
351
|
+
struct AsyncIterator: AsyncIteratorProtocol {
|
|
352
|
+
let interval: TimeInterval
|
|
353
|
+
var lastTick: Date?
|
|
354
|
+
|
|
355
|
+
mutating func next() async -> Date? {
|
|
356
|
+
if Task.isCancelled { return nil }
|
|
357
|
+
|
|
358
|
+
if let last = lastTick {
|
|
359
|
+
let nextTick = last.addingTimeInterval(interval)
|
|
360
|
+
let delay = nextTick.timeIntervalSinceNow
|
|
361
|
+
if delay > 0 {
|
|
362
|
+
try? await Task.sleep(for: .seconds(delay))
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
let now = Date()
|
|
367
|
+
lastTick = now
|
|
368
|
+
return now
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
func makeAsyncIterator() -> AsyncIterator {
|
|
373
|
+
AsyncIterator(interval: interval)
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Usage
|
|
378
|
+
for await tick in AsyncTimerSequence(interval: 1.0) {
|
|
379
|
+
print("Tick: \(tick)")
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Structured Concurrency with TaskGroups
|
|
384
|
+
|
|
385
|
+
Controlled Parallelism:
|
|
386
|
+
```swift
|
|
387
|
+
func processImages(_ urls: [URL], maxConcurrency: Int = 4) async throws -> [ProcessedImage] {
|
|
388
|
+
try await withThrowingTaskGroup(of: ProcessedImage.self) { group in
|
|
389
|
+
var results: [ProcessedImage] = []
|
|
390
|
+
var urlIterator = urls.makeIterator()
|
|
391
|
+
|
|
392
|
+
// Start initial batch
|
|
393
|
+
for _ in 0..<min(maxConcurrency, urls.count) {
|
|
394
|
+
if let url = urlIterator.next() {
|
|
395
|
+
group.addTask { try await self.processImage(url) }
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Process results and add new tasks
|
|
400
|
+
for try await result in group {
|
|
401
|
+
results.append(result)
|
|
402
|
+
|
|
403
|
+
if let url = urlIterator.next() {
|
|
404
|
+
group.addTask { try await self.processImage(url) }
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
return results
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
## Network Layer
|
|
414
|
+
|
|
415
|
+
### Modern URLSession with Async/Await
|
|
416
|
+
|
|
417
|
+
Type-Safe API Client:
|
|
418
|
+
```swift
|
|
419
|
+
actor APIClient {
|
|
420
|
+
private let session: URLSession
|
|
421
|
+
private let baseURL: URL
|
|
422
|
+
private let decoder: JSONDecoder
|
|
423
|
+
private let encoder: JSONEncoder
|
|
424
|
+
|
|
425
|
+
init(
|
|
426
|
+
baseURL: URL,
|
|
427
|
+
session: URLSession = .shared,
|
|
428
|
+
decoder: JSONDecoder = JSONDecoder(),
|
|
429
|
+
encoder: JSONEncoder = JSONEncoder()
|
|
430
|
+
) {
|
|
431
|
+
self.baseURL = baseURL
|
|
432
|
+
self.session = session
|
|
433
|
+
self.decoder = decoder
|
|
434
|
+
self.encoder = encoder
|
|
435
|
+
|
|
436
|
+
decoder.keyDecodingStrategy = .convertFromSnakeCase
|
|
437
|
+
encoder.keyEncodingStrategy = .convertToSnakeCase
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
func get<T: Decodable>(
|
|
441
|
+
_ path: String,
|
|
442
|
+
queryItems: [URLQueryItem] = []
|
|
443
|
+
) async throws(APIError) -> T {
|
|
444
|
+
let request = try buildRequest(path: path, method: "GET", queryItems: queryItems)
|
|
445
|
+
return try await execute(request)
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
func post<T: Decodable, B: Encodable>(
|
|
449
|
+
_ path: String,
|
|
450
|
+
body: B
|
|
451
|
+
) async throws(APIError) -> T {
|
|
452
|
+
var request = try buildRequest(path: path, method: "POST")
|
|
453
|
+
request.httpBody = try encoder.encode(body)
|
|
454
|
+
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
455
|
+
return try await execute(request)
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
func put<T: Decodable, B: Encodable>(
|
|
459
|
+
_ path: String,
|
|
460
|
+
body: B
|
|
461
|
+
) async throws(APIError) -> T {
|
|
462
|
+
var request = try buildRequest(path: path, method: "PUT")
|
|
463
|
+
request.httpBody = try encoder.encode(body)
|
|
464
|
+
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
465
|
+
return try await execute(request)
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
func delete(_ path: String) async throws(APIError) {
|
|
469
|
+
let request = try buildRequest(path: path, method: "DELETE")
|
|
470
|
+
let (_, response) = try await performRequest(request)
|
|
471
|
+
try validateResponse(response)
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
private func buildRequest(
|
|
475
|
+
path: String,
|
|
476
|
+
method: String,
|
|
477
|
+
queryItems: [URLQueryItem] = []
|
|
478
|
+
) throws(APIError) -> URLRequest {
|
|
479
|
+
var components = URLComponents(url: baseURL.appendingPathComponent(path), resolvingAgainstBaseURL: true)
|
|
480
|
+
if !queryItems.isEmpty {
|
|
481
|
+
components?.queryItems = queryItems
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
guard let url = components?.url else {
|
|
485
|
+
throw .invalidURL
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
var request = URLRequest(url: url)
|
|
489
|
+
request.httpMethod = method
|
|
490
|
+
return request
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
private func execute<T: Decodable>(_ request: URLRequest) async throws(APIError) -> T {
|
|
494
|
+
let (data, response) = try await performRequest(request)
|
|
495
|
+
try validateResponse(response)
|
|
496
|
+
|
|
497
|
+
do {
|
|
498
|
+
return try decoder.decode(T.self, from: data)
|
|
499
|
+
} catch {
|
|
500
|
+
throw .decodingError(error)
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
private func performRequest(_ request: URLRequest) async throws(APIError) -> (Data, URLResponse) {
|
|
505
|
+
do {
|
|
506
|
+
return try await session.data(for: request)
|
|
507
|
+
} catch {
|
|
508
|
+
throw .networkError(error)
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
private func validateResponse(_ response: URLResponse) throws(APIError) {
|
|
513
|
+
guard let httpResponse = response as? HTTPURLResponse else {
|
|
514
|
+
throw .invalidResponse
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
guard 200..<300 ~= httpResponse.statusCode else {
|
|
518
|
+
throw .httpError(statusCode: httpResponse.statusCode)
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
enum APIError: Error, LocalizedError {
|
|
524
|
+
case invalidURL
|
|
525
|
+
case networkError(Error)
|
|
526
|
+
case invalidResponse
|
|
527
|
+
case httpError(statusCode: Int)
|
|
528
|
+
case decodingError(Error)
|
|
529
|
+
|
|
530
|
+
var errorDescription: String? {
|
|
531
|
+
switch self {
|
|
532
|
+
case .invalidURL:
|
|
533
|
+
return "Invalid URL"
|
|
534
|
+
case .networkError(let error):
|
|
535
|
+
return "Network error: \(error.localizedDescription)"
|
|
536
|
+
case .invalidResponse:
|
|
537
|
+
return "Invalid server response"
|
|
538
|
+
case .httpError(let code):
|
|
539
|
+
return "HTTP error: \(code)"
|
|
540
|
+
case .decodingError(let error):
|
|
541
|
+
return "Decoding error: \(error.localizedDescription)"
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### Request Interceptor Pattern
|
|
548
|
+
|
|
549
|
+
Authentication Interceptor:
|
|
550
|
+
```swift
|
|
551
|
+
protocol RequestInterceptor: Sendable {
|
|
552
|
+
func intercept(_ request: inout URLRequest) async throws
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
actor AuthInterceptor: RequestInterceptor {
|
|
556
|
+
private let tokenProvider: TokenProviderProtocol
|
|
557
|
+
|
|
558
|
+
init(tokenProvider: TokenProviderProtocol) {
|
|
559
|
+
self.tokenProvider = tokenProvider
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
func intercept(_ request: inout URLRequest) async throws {
|
|
563
|
+
let token = try await tokenProvider.getValidToken()
|
|
564
|
+
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
actor LoggingInterceptor: RequestInterceptor {
|
|
569
|
+
func intercept(_ request: inout URLRequest) async throws {
|
|
570
|
+
print("[\(request.httpMethod ?? "?")] \(request.url?.absoluteString ?? "")")
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
## SwiftData Integration
|
|
576
|
+
|
|
577
|
+
Modern Persistence (iOS 17+):
|
|
578
|
+
```swift
|
|
579
|
+
import SwiftData
|
|
580
|
+
|
|
581
|
+
@Model
|
|
582
|
+
final class Post {
|
|
583
|
+
var id: UUID
|
|
584
|
+
var title: String
|
|
585
|
+
var content: String
|
|
586
|
+
var createdAt: Date
|
|
587
|
+
var author: Author?
|
|
588
|
+
|
|
589
|
+
@Relationship(deleteRule: .cascade, inverse: \Comment.post)
|
|
590
|
+
var comments: [Comment]
|
|
591
|
+
|
|
592
|
+
init(title: String, content: String) {
|
|
593
|
+
self.id = UUID()
|
|
594
|
+
self.title = title
|
|
595
|
+
self.content = content
|
|
596
|
+
self.createdAt = Date()
|
|
597
|
+
self.comments = []
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
@Model
|
|
602
|
+
final class Comment {
|
|
603
|
+
var id: UUID
|
|
604
|
+
var text: String
|
|
605
|
+
var createdAt: Date
|
|
606
|
+
var post: Post?
|
|
607
|
+
|
|
608
|
+
init(text: String) {
|
|
609
|
+
self.id = UUID()
|
|
610
|
+
self.text = text
|
|
611
|
+
self.createdAt = Date()
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// Repository
|
|
616
|
+
@MainActor
|
|
617
|
+
final class PostRepository {
|
|
618
|
+
private let modelContext: ModelContext
|
|
619
|
+
|
|
620
|
+
init(modelContext: ModelContext) {
|
|
621
|
+
self.modelContext = modelContext
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
func fetchPosts() throws -> [Post] {
|
|
625
|
+
let descriptor = FetchDescriptor<Post>(
|
|
626
|
+
sortBy: [SortDescriptor(\.createdAt, order: .reverse)]
|
|
627
|
+
)
|
|
628
|
+
return try modelContext.fetch(descriptor)
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
func save(_ post: Post) throws {
|
|
632
|
+
modelContext.insert(post)
|
|
633
|
+
try modelContext.save()
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
func delete(_ post: Post) throws {
|
|
637
|
+
modelContext.delete(post)
|
|
638
|
+
try modelContext.save()
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
## Performance Optimization
|
|
644
|
+
|
|
645
|
+
### SwiftUI Performance Tips
|
|
646
|
+
|
|
647
|
+
Minimize View Updates:
|
|
648
|
+
- Use `@Observable` instead of `@ObservedObject` for better performance
|
|
649
|
+
- Implement `Equatable` on views when appropriate
|
|
650
|
+
- Use `LazyVStack`/`LazyHStack` for lists
|
|
651
|
+
- Apply `task(id:)` for cancellable async operations
|
|
652
|
+
- Use `@State` for view-local state, avoid unnecessary bindings
|
|
653
|
+
|
|
654
|
+
Memory Management:
|
|
655
|
+
- Use weak references in closures
|
|
656
|
+
- Implement proper cancellation in async tasks
|
|
657
|
+
- Profile with Instruments: Allocations, Leaks
|
|
658
|
+
- Use `nonisolated` where actor isolation is not needed
|
|
659
|
+
|
|
660
|
+
### Profiling with Instruments
|
|
661
|
+
|
|
662
|
+
Key Instruments:
|
|
663
|
+
- Time Profiler: CPU usage and hot paths
|
|
664
|
+
- Allocations: Memory allocation patterns
|
|
665
|
+
- Leaks: Memory leak detection
|
|
666
|
+
- SwiftUI: View body evaluations and updates
|
|
667
|
+
- Network: HTTP request analysis
|
|
668
|
+
|
|
669
|
+
---
|
|
670
|
+
|
|
671
|
+
Version: 1.0.0
|
|
672
|
+
Last Updated: 2025-12-07
|