moai-adk 0.32.8__py3-none-any.whl → 0.41.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/cli/commands/init.py +4 -1
- moai_adk/cli/commands/update.py +31 -26
- moai_adk/cli/worktree/cli.py +54 -43
- moai_adk/cli/worktree/manager.py +17 -14
- moai_adk/cli/worktree/registry.py +313 -19
- moai_adk/core/config/unified.py +237 -63
- moai_adk/core/error_recovery_system.py +22 -4
- moai_adk/core/git/conflict_detector.py +10 -1
- moai_adk/core/git/event_detector.py +16 -5
- moai_adk/core/language_config_resolver.py +96 -3
- moai_adk/core/merge/analyzer.py +509 -324
- moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
- moai_adk/core/migration/backup_manager.py +54 -4
- moai_adk/core/migration/file_migrator.py +174 -2
- moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
- moai_adk/core/migration/version_detector.py +123 -19
- moai_adk/core/migration/version_migrator.py +44 -9
- moai_adk/core/project/backup_utils.py +9 -1
- moai_adk/core/project/initializer.py +33 -96
- moai_adk/core/project/phase_executor.py +79 -33
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/realtime_monitoring_dashboard.py +3 -3
- moai_adk/core/rollback_manager.py +46 -19
- moai_adk/core/template/backup.py +4 -3
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +144 -9
- moai_adk/core/template_engine.py +10 -1
- moai_adk/core/template_variable_synchronizer.py +16 -2
- moai_adk/core/version_sync.py +54 -6
- moai_adk/project/configuration.py +1 -1
- moai_adk/statusline/config.py +5 -2
- moai_adk/statusline/main.py +58 -0
- moai_adk/statusline/renderer.py +38 -78
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +218 -51
- moai_adk/templates/.claude/agents/moai/builder-agent.md +46 -11
- moai_adk/templates/.claude/agents/moai/builder-command.md +88 -26
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +753 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +79 -8
- moai_adk/templates/.claude/agents/moai/expert-backend.md +100 -28
- moai_adk/templates/.claude/agents/moai/expert-database.md +20 -12
- moai_adk/templates/.claude/agents/moai/expert-debug.md +19 -8
- moai_adk/templates/.claude/agents/moai/expert-devops.md +36 -25
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +99 -38
- moai_adk/templates/.claude/agents/moai/expert-performance.md +661 -0
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +218 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +55 -4
- moai_adk/templates/.claude/agents/moai/expert-testing.md +737 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +20 -11
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +13 -4
- moai_adk/templates/.claude/agents/moai/manager-docs.md +15 -7
- moai_adk/templates/.claude/agents/moai/manager-git.md +192 -37
- moai_adk/templates/.claude/agents/moai/manager-project.md +13 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +48 -6
- moai_adk/templates/.claude/agents/moai/manager-spec.md +110 -8
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +203 -17
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +217 -23
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +102 -7
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +107 -86
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +50 -4
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +52 -4
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +49 -5
- moai_adk/templates/.claude/commands/moai/0-project.md +503 -307
- moai_adk/templates/.claude/commands/moai/1-plan.md +255 -323
- moai_adk/templates/.claude/commands/moai/2-run.md +257 -315
- moai_adk/templates/.claude/commands/moai/3-sync.md +421 -56
- moai_adk/templates/.claude/commands/moai/9-feedback.md +40 -34
- moai_adk/templates/.claude/hooks/moai/__init__.py +0 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +19 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
- moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +12 -14
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +1 -1
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +104 -14
- moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
- moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +804 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +14 -2
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +256 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +253 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +307 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +231 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +28 -24
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +236 -32
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +265 -2
- moai_adk/templates/.claude/output-styles/moai/yoda.md +23 -2
- moai_adk/templates/.claude/settings.json +43 -6
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +302 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/reference.md +139 -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 +251 -196
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +252 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +234 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +18 -13
- 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 +20 -14
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +123 -425
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +16 -15
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +104 -315
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +6 -6
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +196 -154
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +2 -2
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +12 -1
- 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 +33 -134
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +31 -18
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +30 -30
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +311 -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 +17 -16
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +430 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +394 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +472 -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 +377 -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 +386 -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-javascript/SKILL.md +418 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +383 -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 +504 -0
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +489 -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 +389 -0
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +432 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +377 -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 +211 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +191 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +364 -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 +93 -227
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +25 -6
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +16 -13
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +1 -1
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +425 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +230 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +205 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +223 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +206 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +209 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +473 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/modules/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/modules/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +306 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/SKILL.md +214 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/examples.md +697 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/index.md +96 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/acp.md +115 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/agents.md +241 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/commands.md +197 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/custom-tools.md +197 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/formatters.md +164 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/keybinds.md +150 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/lsp-servers.md +156 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/mcp-servers.md +214 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/models.md +197 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/permissions.md +162 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/rules.md +129 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/skills.md +192 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/themes.md +200 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/tools.md +169 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/config.md +211 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/enterprise.md +68 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/intro.md +127 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/migration-1.0.md +82 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/network.md +72 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/providers.md +310 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/troubleshooting.md +124 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/ecosystem.md +75 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/plugins.md +218 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/sdk.md +266 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/server.md +207 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/cli.md +159 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/github.md +181 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/gitlab.md +122 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/ide.md +74 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/share.md +106 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/tui.md +129 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/zen.md +118 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/reference.md +790 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +189 -424
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +187 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +284 -212
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +2 -2
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +1 -1
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +22 -1
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +336 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +12 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +221 -367
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +227 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.git-hooks/pre-push +168 -50
- moai_adk/templates/.gitignore +0 -3
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +5 -12
- moai_adk/templates/.moai/config/config.yaml +20 -306
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +105 -10
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +259 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +4 -5
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +12 -55
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +111 -21
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +34 -18
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +19 -75
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +83 -7
- moai_adk/templates/.moai/config/sections/language.yaml +7 -7
- moai_adk/templates/.moai/config/sections/project.yaml +1 -1
- moai_adk/templates/.moai/config/sections/quality.yaml +7 -4
- moai_adk/templates/.moai/config/sections/system.yaml +11 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +19 -13
- moai_adk/templates/.moai/scripts/setup-glm.py +4 -4
- moai_adk/templates/CLAUDE.md +578 -154
- moai_adk/utils/common.py +33 -0
- moai_adk/version.py +1 -1
- {moai_adk-0.32.8.dist-info → moai_adk-0.41.0.dist-info}/METADATA +905 -109
- moai_adk-0.41.0.dist-info/RECORD +683 -0
- moai_adk/core/config/auto_spec_config.py +0 -340
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
- moai_adk/core/spec/confidence_scoring.py +0 -680
- moai_adk/core/spec/ears_template_engine.py +0 -1247
- moai_adk/core/spec/quality_validator.py +0 -687
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +0 -352
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +0 -52
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +0 -334
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +0 -310
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +0 -256
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +0 -253
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +0 -133
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +0 -296
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +0 -1269
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +0 -331
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +0 -186
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +0 -290
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +0 -1225
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +0 -567
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +0 -323
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +0 -204
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -135
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -410
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
- moai_adk/templates/.moai/cache/personalization.json +0 -10
- moai_adk/templates/.moai/config/presets/manual.yaml +0 -28
- moai_adk/templates/.moai/config/presets/personal.yaml +0 -30
- moai_adk/templates/.moai/config/presets/team.yaml +0 -33
- moai_adk-0.32.8.dist-info/RECORD +0 -396
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
- {moai_adk-0.32.8.dist-info → moai_adk-0.41.0.dist-info}/WHEEL +0 -0
- {moai_adk-0.32.8.dist-info → moai_adk-0.41.0.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.32.8.dist-info → moai_adk-0.41.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
# Phone Authentication Module
|
|
2
|
+
|
|
3
|
+
Comprehensive guide for implementing SMS-based phone number authentication with Firebase, including international support, reCAPTCHA verification, and platform-specific implementations.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Phone authentication enables users to sign in using their phone number via SMS verification. Firebase handles SMS delivery, verification code generation, and user account management.
|
|
10
|
+
|
|
11
|
+
Key Features:
|
|
12
|
+
- International phone number support with E.164 format
|
|
13
|
+
- Automatic reCAPTCHA verification for web
|
|
14
|
+
- Auto-verification on Android devices
|
|
15
|
+
- Rate limiting and abuse protection built-in
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Web Implementation
|
|
20
|
+
|
|
21
|
+
### Basic Phone Authentication Flow
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import {
|
|
25
|
+
getAuth,
|
|
26
|
+
RecaptchaVerifier,
|
|
27
|
+
signInWithPhoneNumber,
|
|
28
|
+
PhoneAuthProvider,
|
|
29
|
+
signInWithCredential
|
|
30
|
+
} from 'firebase/auth';
|
|
31
|
+
|
|
32
|
+
const auth = getAuth();
|
|
33
|
+
|
|
34
|
+
// Step 1: Set up reCAPTCHA verifier
|
|
35
|
+
const setupRecaptcha = () => {
|
|
36
|
+
const recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', {
|
|
37
|
+
size: 'normal',
|
|
38
|
+
callback: (response: string) => {
|
|
39
|
+
console.log('reCAPTCHA solved');
|
|
40
|
+
},
|
|
41
|
+
'expired-callback': () => {
|
|
42
|
+
console.log('reCAPTCHA expired');
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return recaptchaVerifier;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Step 2: Send verification code
|
|
49
|
+
const sendVerificationCode = async (phoneNumber: string) => {
|
|
50
|
+
const recaptchaVerifier = setupRecaptcha();
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
const confirmationResult = await signInWithPhoneNumber(
|
|
54
|
+
auth,
|
|
55
|
+
phoneNumber,
|
|
56
|
+
recaptchaVerifier
|
|
57
|
+
);
|
|
58
|
+
return confirmationResult;
|
|
59
|
+
} catch (error: any) {
|
|
60
|
+
if (error.code === 'auth/invalid-phone-number') {
|
|
61
|
+
throw new Error('Invalid phone number format');
|
|
62
|
+
}
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Step 3: Verify the code
|
|
68
|
+
const verifyCode = async (confirmationResult: any, code: string) => {
|
|
69
|
+
try {
|
|
70
|
+
const result = await confirmationResult.confirm(code);
|
|
71
|
+
return result.user;
|
|
72
|
+
} catch (error: any) {
|
|
73
|
+
if (error.code === 'auth/invalid-verification-code') {
|
|
74
|
+
throw new Error('Invalid verification code');
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Invisible reCAPTCHA
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
const setupInvisibleRecaptcha = () => {
|
|
85
|
+
const recaptchaVerifier = new RecaptchaVerifier(auth, 'sign-in-button', {
|
|
86
|
+
size: 'invisible',
|
|
87
|
+
callback: () => {
|
|
88
|
+
onSignInSubmit();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return recaptchaVerifier;
|
|
92
|
+
};
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Flutter Implementation
|
|
98
|
+
|
|
99
|
+
### Complete Phone Auth Flow
|
|
100
|
+
|
|
101
|
+
```dart
|
|
102
|
+
import 'package:firebase_auth/firebase_auth.dart';
|
|
103
|
+
|
|
104
|
+
class PhoneAuthService {
|
|
105
|
+
final FirebaseAuth _auth = FirebaseAuth.instance;
|
|
106
|
+
String? _verificationId;
|
|
107
|
+
int? _resendToken;
|
|
108
|
+
|
|
109
|
+
Future<void> sendVerificationCode({
|
|
110
|
+
required String phoneNumber,
|
|
111
|
+
required Function(String verificationId) onCodeSent,
|
|
112
|
+
required Function(PhoneAuthCredential credential) onAutoVerify,
|
|
113
|
+
required Function(String error) onError,
|
|
114
|
+
}) async {
|
|
115
|
+
await _auth.verifyPhoneNumber(
|
|
116
|
+
phoneNumber: phoneNumber,
|
|
117
|
+
|
|
118
|
+
verificationCompleted: (PhoneAuthCredential credential) async {
|
|
119
|
+
onAutoVerify(credential);
|
|
120
|
+
await _auth.signInWithCredential(credential);
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
verificationFailed: (FirebaseAuthException e) {
|
|
124
|
+
if (e.code == 'invalid-phone-number') {
|
|
125
|
+
onError('Invalid phone number format');
|
|
126
|
+
} else if (e.code == 'too-many-requests') {
|
|
127
|
+
onError('Too many attempts. Please try again later.');
|
|
128
|
+
} else {
|
|
129
|
+
onError(e.message ?? 'Verification failed');
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
codeSent: (String verificationId, int? resendToken) {
|
|
134
|
+
_verificationId = verificationId;
|
|
135
|
+
_resendToken = resendToken;
|
|
136
|
+
onCodeSent(verificationId);
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
codeAutoRetrievalTimeout: (String verificationId) {
|
|
140
|
+
_verificationId = verificationId;
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
timeout: const Duration(seconds: 60),
|
|
144
|
+
forceResendingToken: _resendToken,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
Future<UserCredential> verifyCode(String smsCode) async {
|
|
149
|
+
if (_verificationId == null) {
|
|
150
|
+
throw Exception('No verification ID');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
final credential = PhoneAuthProvider.credential(
|
|
154
|
+
verificationId: _verificationId!,
|
|
155
|
+
smsCode: smsCode,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
return await _auth.signInWithCredential(credential);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## iOS Native Implementation
|
|
166
|
+
|
|
167
|
+
```swift
|
|
168
|
+
import FirebaseAuth
|
|
169
|
+
|
|
170
|
+
class PhoneAuthManager {
|
|
171
|
+
private var verificationID: String?
|
|
172
|
+
|
|
173
|
+
func sendVerificationCode(to phoneNumber: String, completion: @escaping (Result<Void, Error>) -> Void) {
|
|
174
|
+
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { [weak self] verificationID, error in
|
|
175
|
+
if let error = error {
|
|
176
|
+
completion(.failure(error))
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
self?.verificationID = verificationID
|
|
181
|
+
completion(.success(()))
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
func verifyCode(_ code: String, completion: @escaping (Result<User, Error>) -> Void) {
|
|
186
|
+
guard let verificationID = verificationID else {
|
|
187
|
+
completion(.failure(NSError(domain: "PhoneAuth", code: -1,
|
|
188
|
+
userInfo: [NSLocalizedDescriptionKey: "No verification ID"])))
|
|
189
|
+
return
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
let credential = PhoneAuthProvider.provider().credential(
|
|
193
|
+
withVerificationID: verificationID,
|
|
194
|
+
verificationCode: code
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
Auth.auth().signIn(with: credential) { authResult, error in
|
|
198
|
+
if let error = error {
|
|
199
|
+
completion(.failure(error))
|
|
200
|
+
return
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if let user = authResult?.user {
|
|
204
|
+
completion(.success(user))
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Android Native Implementation
|
|
214
|
+
|
|
215
|
+
```kotlin
|
|
216
|
+
import com.google.firebase.auth.*
|
|
217
|
+
import java.util.concurrent.TimeUnit
|
|
218
|
+
|
|
219
|
+
class PhoneAuthManager(private val activity: Activity) {
|
|
220
|
+
private var verificationId: String? = null
|
|
221
|
+
private var resendToken: PhoneAuthProvider.ForceResendingToken? = null
|
|
222
|
+
|
|
223
|
+
private val callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
|
|
224
|
+
override fun onVerificationCompleted(credential: PhoneAuthCredential) {
|
|
225
|
+
signInWithCredential(credential)
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
override fun onVerificationFailed(e: FirebaseException) {
|
|
229
|
+
when (e) {
|
|
230
|
+
is FirebaseAuthInvalidCredentialsException -> { /* Invalid number */ }
|
|
231
|
+
is FirebaseTooManyRequestsException -> { /* Quota exceeded */ }
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
override fun onCodeSent(
|
|
236
|
+
verificationId: String,
|
|
237
|
+
token: PhoneAuthProvider.ForceResendingToken
|
|
238
|
+
) {
|
|
239
|
+
this@PhoneAuthManager.verificationId = verificationId
|
|
240
|
+
this@PhoneAuthManager.resendToken = token
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
fun sendVerificationCode(phoneNumber: String) {
|
|
245
|
+
val options = PhoneAuthOptions.newBuilder(FirebaseAuth.getInstance())
|
|
246
|
+
.setPhoneNumber(phoneNumber)
|
|
247
|
+
.setTimeout(60L, TimeUnit.SECONDS)
|
|
248
|
+
.setActivity(activity)
|
|
249
|
+
.setCallbacks(callbacks)
|
|
250
|
+
.build()
|
|
251
|
+
|
|
252
|
+
PhoneAuthProvider.verifyPhoneNumber(options)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
fun verifyCode(code: String) {
|
|
256
|
+
verificationId?.let { id ->
|
|
257
|
+
val credential = PhoneAuthProvider.getCredential(id, code)
|
|
258
|
+
signInWithCredential(credential)
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
private fun signInWithCredential(credential: PhoneAuthCredential) {
|
|
263
|
+
FirebaseAuth.getInstance().signInWithCredential(credential)
|
|
264
|
+
.addOnCompleteListener(activity) { task ->
|
|
265
|
+
if (task.isSuccessful) {
|
|
266
|
+
val user = task.result?.user
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Phone Number Formatting
|
|
276
|
+
|
|
277
|
+
Always use E.164 format for phone numbers:
|
|
278
|
+
|
|
279
|
+
```typescript
|
|
280
|
+
// E.164 Format Examples
|
|
281
|
+
const validFormats = [
|
|
282
|
+
'+12025551234', // US
|
|
283
|
+
'+442071234567', // UK
|
|
284
|
+
'+81312345678', // Japan
|
|
285
|
+
'+8210123456789', // South Korea
|
|
286
|
+
];
|
|
287
|
+
|
|
288
|
+
const isValidE164 = (phone: string): boolean => {
|
|
289
|
+
const e164Regex = /^\+[1-9]\d{1,14}$/;
|
|
290
|
+
return e164Regex.test(phone);
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
const formatToE164 = (phone: string, countryCode: string): string => {
|
|
294
|
+
const digits = phone.replace(/\D/g, '');
|
|
295
|
+
const normalized = digits.startsWith('0') ? digits.slice(1) : digits;
|
|
296
|
+
return `+${countryCode}${normalized}`;
|
|
297
|
+
};
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Error Handling
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
const handlePhoneAuthError = (error: any): string => {
|
|
306
|
+
switch (error.code) {
|
|
307
|
+
case 'auth/invalid-phone-number':
|
|
308
|
+
return 'Please enter a valid phone number';
|
|
309
|
+
case 'auth/too-many-requests':
|
|
310
|
+
return 'Too many attempts. Please try again later';
|
|
311
|
+
case 'auth/quota-exceeded':
|
|
312
|
+
return 'SMS quota exceeded';
|
|
313
|
+
case 'auth/invalid-verification-code':
|
|
314
|
+
return 'Invalid verification code';
|
|
315
|
+
case 'auth/code-expired':
|
|
316
|
+
return 'Verification code expired';
|
|
317
|
+
case 'auth/captcha-check-failed':
|
|
318
|
+
return 'reCAPTCHA verification failed';
|
|
319
|
+
default:
|
|
320
|
+
return 'An error occurred';
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## Testing with Firebase Emulator
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
import { connectAuthEmulator } from 'firebase/auth';
|
|
331
|
+
|
|
332
|
+
if (process.env.NODE_ENV === 'development') {
|
|
333
|
+
connectAuthEmulator(auth, 'http://localhost:9099');
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Test phone numbers (emulator only)
|
|
337
|
+
const testPhoneNumbers = ['+15551234567', '+15559876543'];
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## Best Practices
|
|
343
|
+
|
|
344
|
+
Rate Limiting and Abuse Prevention:
|
|
345
|
+
- Firebase automatically rate limits SMS sending
|
|
346
|
+
- Implement client-side rate limiting for better UX
|
|
347
|
+
- Show countdown timer after sending code
|
|
348
|
+
- Limit resend attempts per session
|
|
349
|
+
|
|
350
|
+
User Experience Guidelines:
|
|
351
|
+
- Pre-fill country code based on device locale
|
|
352
|
+
- Show clear instructions for phone number format
|
|
353
|
+
- Provide countdown timer for code expiration
|
|
354
|
+
- Allow code resend after timeout period
|
|
355
|
+
|
|
356
|
+
Security Considerations:
|
|
357
|
+
- Validate phone number format before sending
|
|
358
|
+
- Implement proper error handling for all edge cases
|
|
359
|
+
- Use invisible reCAPTCHA for seamless experience
|
|
360
|
+
- Consider SIM swap attack mitigation for sensitive operations
|
|
361
|
+
|
|
362
|
+
Cost Management:
|
|
363
|
+
- SMS messages incur costs per message sent
|
|
364
|
+
- Implement proper rate limiting to control costs
|
|
365
|
+
- Use test phone numbers during development
|
|
366
|
+
- Monitor SMS usage in Firebase Console
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
Version: 1.0.0
|
|
371
|
+
Last Updated: 2025-12-07
|
|
372
|
+
Parent Skill: moai-platform-firebase-auth
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# Social Authentication Module
|
|
2
|
+
|
|
3
|
+
Comprehensive guide for implementing social identity providers with Firebase Authentication including Google, Facebook, Apple, Twitter/X, GitHub, and Microsoft.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Google Sign-In
|
|
8
|
+
|
|
9
|
+
Google Sign-In provides seamless authentication within the Google ecosystem with access to Google APIs and services.
|
|
10
|
+
|
|
11
|
+
### Web Implementation
|
|
12
|
+
|
|
13
|
+
Step 1: Enable Google Sign-In provider in Firebase Console under Authentication then Sign-in method.
|
|
14
|
+
|
|
15
|
+
Step 2: Configure OAuth consent screen in Google Cloud Console with appropriate scopes.
|
|
16
|
+
|
|
17
|
+
Step 3: Import and configure Firebase Auth SDK:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { getAuth, signInWithPopup, signInWithRedirect, GoogleAuthProvider } from 'firebase/auth';
|
|
21
|
+
|
|
22
|
+
const auth = getAuth();
|
|
23
|
+
const provider = new GoogleAuthProvider();
|
|
24
|
+
|
|
25
|
+
// Add OAuth scopes for Google APIs access
|
|
26
|
+
provider.addScope('https://www.googleapis.com/auth/calendar.readonly');
|
|
27
|
+
provider.addScope('https://www.googleapis.com/auth/contacts.readonly');
|
|
28
|
+
|
|
29
|
+
// Set custom parameters
|
|
30
|
+
provider.setCustomParameters({
|
|
31
|
+
login_hint: 'user@example.com',
|
|
32
|
+
prompt: 'select_account'
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Popup flow (recommended for web)
|
|
36
|
+
const result = await signInWithPopup(auth, provider);
|
|
37
|
+
const credential = GoogleAuthProvider.credentialFromResult(result);
|
|
38
|
+
const accessToken = credential?.accessToken;
|
|
39
|
+
const user = result.user;
|
|
40
|
+
|
|
41
|
+
// Redirect flow (alternative for mobile browsers)
|
|
42
|
+
await signInWithRedirect(auth, provider);
|
|
43
|
+
const redirectResult = await getRedirectResult(auth);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Flutter Implementation
|
|
47
|
+
|
|
48
|
+
```dart
|
|
49
|
+
import 'package:firebase_auth/firebase_auth.dart';
|
|
50
|
+
import 'package:google_sign_in/google_sign_in.dart';
|
|
51
|
+
|
|
52
|
+
Future<UserCredential> signInWithGoogle() async {
|
|
53
|
+
final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();
|
|
54
|
+
|
|
55
|
+
if (googleUser == null) {
|
|
56
|
+
throw Exception('Google Sign-In was cancelled');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
|
|
60
|
+
|
|
61
|
+
final credential = GoogleAuthProvider.credential(
|
|
62
|
+
accessToken: googleAuth.accessToken,
|
|
63
|
+
idToken: googleAuth.idToken,
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
return await FirebaseAuth.instance.signInWithCredential(credential);
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### iOS Native Implementation
|
|
71
|
+
|
|
72
|
+
```swift
|
|
73
|
+
import FirebaseAuth
|
|
74
|
+
import GoogleSignIn
|
|
75
|
+
|
|
76
|
+
func signInWithGoogle() {
|
|
77
|
+
guard let clientID = FirebaseApp.app()?.options.clientID else { return }
|
|
78
|
+
|
|
79
|
+
let config = GIDConfiguration(clientID: clientID)
|
|
80
|
+
GIDSignIn.sharedInstance.configuration = config
|
|
81
|
+
|
|
82
|
+
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
|
|
83
|
+
let rootViewController = windowScene.windows.first?.rootViewController else { return }
|
|
84
|
+
|
|
85
|
+
GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController) { result, error in
|
|
86
|
+
if let error = error {
|
|
87
|
+
print("Google Sign-In error: \(error.localizedDescription)")
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
guard let user = result?.user,
|
|
92
|
+
let idToken = user.idToken?.tokenString else { return }
|
|
93
|
+
|
|
94
|
+
let credential = GoogleAuthProvider.credential(
|
|
95
|
+
withIDToken: idToken,
|
|
96
|
+
accessToken: user.accessToken.tokenString
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
Auth.auth().signIn(with: credential) { authResult, error in
|
|
100
|
+
// Handle sign-in result
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Mobile Configuration Requirements
|
|
107
|
+
|
|
108
|
+
iOS Configuration:
|
|
109
|
+
- Add reversed client ID to URL schemes in Info.plist
|
|
110
|
+
- Enable Keychain Sharing capability
|
|
111
|
+
- Configure GoogleService-Info.plist with correct bundle ID
|
|
112
|
+
|
|
113
|
+
Android Configuration:
|
|
114
|
+
- Add SHA-1 and SHA-256 fingerprints to Firebase project settings
|
|
115
|
+
- Configure google-services.json with correct package name
|
|
116
|
+
- Ensure play-services-auth dependency is included
|
|
117
|
+
|
|
118
|
+
Web Configuration:
|
|
119
|
+
- Configure authorized domains in Firebase Console
|
|
120
|
+
- Set up OAuth consent screen in Google Cloud Console
|
|
121
|
+
- Add authorized JavaScript origins and redirect URIs
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Facebook Login
|
|
126
|
+
|
|
127
|
+
Facebook Login integration with Firebase Auth for social authentication.
|
|
128
|
+
|
|
129
|
+
### Web Implementation
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
import { FacebookAuthProvider, signInWithPopup } from 'firebase/auth';
|
|
133
|
+
|
|
134
|
+
const provider = new FacebookAuthProvider();
|
|
135
|
+
|
|
136
|
+
provider.addScope('email');
|
|
137
|
+
provider.addScope('public_profile');
|
|
138
|
+
|
|
139
|
+
provider.setCustomParameters({
|
|
140
|
+
display: 'popup',
|
|
141
|
+
auth_type: 'rerequest'
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const result = await signInWithPopup(auth, provider);
|
|
145
|
+
const credential = FacebookAuthProvider.credentialFromResult(result);
|
|
146
|
+
const accessToken = credential?.accessToken;
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Flutter Implementation
|
|
150
|
+
|
|
151
|
+
```dart
|
|
152
|
+
import 'package:firebase_auth/firebase_auth.dart';
|
|
153
|
+
import 'package:flutter_facebook_auth/flutter_facebook_auth.dart';
|
|
154
|
+
|
|
155
|
+
Future<UserCredential> signInWithFacebook() async {
|
|
156
|
+
final LoginResult loginResult = await FacebookAuth.instance.login(
|
|
157
|
+
permissions: ['email', 'public_profile'],
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
if (loginResult.status != LoginStatus.success) {
|
|
161
|
+
throw Exception('Facebook login failed');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
final OAuthCredential credential = FacebookAuthProvider.credential(
|
|
165
|
+
loginResult.accessToken!.tokenString,
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
return await FirebaseAuth.instance.signInWithCredential(credential);
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Apple Sign-In
|
|
175
|
+
|
|
176
|
+
Apple Sign-In is required for iOS apps that offer third-party sign-in options.
|
|
177
|
+
|
|
178
|
+
### Web Implementation
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
import { OAuthProvider, signInWithPopup } from 'firebase/auth';
|
|
182
|
+
|
|
183
|
+
const provider = new OAuthProvider('apple.com');
|
|
184
|
+
provider.addScope('email');
|
|
185
|
+
provider.addScope('name');
|
|
186
|
+
|
|
187
|
+
const result = await signInWithPopup(auth, provider);
|
|
188
|
+
const credential = OAuthProvider.credentialFromResult(result);
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### iOS Native Implementation
|
|
192
|
+
|
|
193
|
+
```swift
|
|
194
|
+
import FirebaseAuth
|
|
195
|
+
import AuthenticationServices
|
|
196
|
+
import CryptoKit
|
|
197
|
+
|
|
198
|
+
class AppleSignInManager: NSObject, ASAuthorizationControllerDelegate {
|
|
199
|
+
private var currentNonce: String?
|
|
200
|
+
|
|
201
|
+
func startSignInWithAppleFlow() {
|
|
202
|
+
let nonce = randomNonceString()
|
|
203
|
+
currentNonce = nonce
|
|
204
|
+
|
|
205
|
+
let appleIDProvider = ASAuthorizationAppleIDProvider()
|
|
206
|
+
let request = appleIDProvider.createRequest()
|
|
207
|
+
request.requestedScopes = [.fullName, .email]
|
|
208
|
+
request.nonce = sha256(nonce)
|
|
209
|
+
|
|
210
|
+
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
|
|
211
|
+
authorizationController.delegate = self
|
|
212
|
+
authorizationController.performRequests()
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
func authorizationController(controller: ASAuthorizationController,
|
|
216
|
+
didCompleteWithAuthorization authorization: ASAuthorization) {
|
|
217
|
+
guard let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential,
|
|
218
|
+
let nonce = currentNonce,
|
|
219
|
+
let appleIDToken = appleIDCredential.identityToken,
|
|
220
|
+
let idTokenString = String(data: appleIDToken, encoding: .utf8) else { return }
|
|
221
|
+
|
|
222
|
+
let credential = OAuthProvider.appleCredential(
|
|
223
|
+
withIDToken: idTokenString,
|
|
224
|
+
rawNonce: nonce,
|
|
225
|
+
fullName: appleIDCredential.fullName
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
Auth.auth().signIn(with: credential) { authResult, error in }
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Twitter/X and GitHub Authentication
|
|
236
|
+
|
|
237
|
+
### Twitter/X Implementation
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
import { TwitterAuthProvider, signInWithPopup } from 'firebase/auth';
|
|
241
|
+
|
|
242
|
+
const provider = new TwitterAuthProvider();
|
|
243
|
+
const result = await signInWithPopup(auth, provider);
|
|
244
|
+
const credential = TwitterAuthProvider.credentialFromResult(result);
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### GitHub Implementation
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
import { GithubAuthProvider, signInWithPopup } from 'firebase/auth';
|
|
251
|
+
|
|
252
|
+
const provider = new GithubAuthProvider();
|
|
253
|
+
provider.addScope('repo');
|
|
254
|
+
provider.addScope('read:user');
|
|
255
|
+
|
|
256
|
+
const result = await signInWithPopup(auth, provider);
|
|
257
|
+
const credential = GithubAuthProvider.credentialFromResult(result);
|
|
258
|
+
const token = credential?.accessToken;
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Microsoft Authentication
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
import { OAuthProvider, signInWithPopup } from 'firebase/auth';
|
|
265
|
+
|
|
266
|
+
const provider = new OAuthProvider('microsoft.com');
|
|
267
|
+
provider.addScope('mail.read');
|
|
268
|
+
provider.addScope('calendars.read');
|
|
269
|
+
|
|
270
|
+
const result = await signInWithPopup(auth, provider);
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Error Handling
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import { AuthErrorCodes } from 'firebase/auth';
|
|
279
|
+
|
|
280
|
+
try {
|
|
281
|
+
const result = await signInWithPopup(auth, provider);
|
|
282
|
+
} catch (error: any) {
|
|
283
|
+
switch (error.code) {
|
|
284
|
+
case AuthErrorCodes.POPUP_CLOSED_BY_USER:
|
|
285
|
+
console.log('Sign-in popup was closed');
|
|
286
|
+
break;
|
|
287
|
+
case AuthErrorCodes.POPUP_BLOCKED:
|
|
288
|
+
await signInWithRedirect(auth, provider);
|
|
289
|
+
break;
|
|
290
|
+
case 'auth/account-exists-with-different-credential':
|
|
291
|
+
const methods = await fetchSignInMethodsForEmail(auth, error.customData?.email);
|
|
292
|
+
break;
|
|
293
|
+
default:
|
|
294
|
+
console.error('Authentication error:', error.message);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Account Linking
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
import { linkWithPopup, linkWithCredential, unlink } from 'firebase/auth';
|
|
305
|
+
|
|
306
|
+
// Link with popup
|
|
307
|
+
await linkWithPopup(auth.currentUser, new GoogleAuthProvider());
|
|
308
|
+
|
|
309
|
+
// Unlink provider
|
|
310
|
+
await unlink(auth.currentUser, 'google.com');
|
|
311
|
+
|
|
312
|
+
// Get linked providers
|
|
313
|
+
const providers = auth.currentUser?.providerData.map(p => p.providerId);
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## Best Practices
|
|
319
|
+
|
|
320
|
+
Security Considerations:
|
|
321
|
+
- Always validate tokens server-side for sensitive operations
|
|
322
|
+
- Use nonce for Apple Sign-In to prevent replay attacks
|
|
323
|
+
- Implement proper error handling for all authentication flows
|
|
324
|
+
|
|
325
|
+
User Experience Guidelines:
|
|
326
|
+
- Provide multiple sign-in options for user convenience
|
|
327
|
+
- Handle account linking gracefully when email already exists
|
|
328
|
+
- Show loading states during authentication flows
|
|
329
|
+
|
|
330
|
+
Platform-Specific Notes:
|
|
331
|
+
- iOS requires Apple Sign-In if offering third-party sign-in
|
|
332
|
+
- Android requires SHA fingerprints for Google Sign-In
|
|
333
|
+
- Web popup may be blocked; implement redirect fallback
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
Version: 1.0.0
|
|
338
|
+
Last Updated: 2025-12-07
|
|
339
|
+
Parent Skill: moai-platform-firebase-auth
|