moai-adk 0.34.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- moai_adk/__main__.py +136 -5
- moai_adk/astgrep/__init__.py +37 -0
- moai_adk/astgrep/analyzer.py +522 -0
- moai_adk/astgrep/models.py +124 -0
- moai_adk/astgrep/rules.py +179 -0
- moai_adk/cli/commands/analyze.py +11 -2
- moai_adk/cli/commands/doctor.py +7 -1
- moai_adk/cli/commands/init.py +321 -11
- moai_adk/cli/commands/language.py +7 -1
- moai_adk/cli/commands/rank.py +449 -0
- moai_adk/cli/commands/status.py +7 -1
- moai_adk/cli/commands/switch.py +325 -0
- moai_adk/cli/commands/update.py +296 -23
- moai_adk/cli/prompts/init_prompts.py +362 -66
- moai_adk/cli/prompts/translations/__init__.py +573 -0
- moai_adk/cli/ui/prompts.py +61 -2
- moai_adk/cli/worktree/cli.py +106 -1
- moai_adk/cli/worktree/manager.py +155 -0
- moai_adk/core/config/unified.py +244 -63
- moai_adk/core/credentials.py +264 -0
- 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/integration/engine.py +2 -2
- moai_adk/core/integration/integration_tester.py +5 -5
- moai_adk/core/language_config_resolver.py +9 -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/model_allocator.py +241 -0
- moai_adk/core/project/backup_utils.py +12 -2
- moai_adk/core/project/initializer.py +44 -87
- moai_adk/core/project/phase_executor.py +95 -33
- moai_adk/core/project/validator.py +16 -1
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/rollback_manager.py +60 -25
- moai_adk/core/template/backup.py +88 -6
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +334 -11
- 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/foundation/__init__.py +1 -20
- moai_adk/foundation/testing.py +1 -1
- moai_adk/loop/__init__.py +54 -0
- moai_adk/loop/controller.py +305 -0
- moai_adk/loop/feedback.py +230 -0
- moai_adk/loop/state.py +209 -0
- moai_adk/loop/storage.py +220 -0
- moai_adk/lsp/__init__.py +70 -0
- moai_adk/lsp/client.py +320 -0
- moai_adk/lsp/models.py +261 -0
- moai_adk/lsp/protocol.py +404 -0
- moai_adk/lsp/server_manager.py +248 -0
- moai_adk/project/configuration.py +8 -1
- moai_adk/py.typed +0 -0
- moai_adk/ralph/__init__.py +37 -0
- moai_adk/ralph/engine.py +307 -0
- moai_adk/rank/__init__.py +21 -0
- moai_adk/rank/auth.py +425 -0
- moai_adk/rank/client.py +557 -0
- moai_adk/rank/config.py +147 -0
- moai_adk/rank/hook.py +1503 -0
- moai_adk/rank/py.typed +0 -0
- moai_adk/statusline/__init__.py +3 -0
- moai_adk/statusline/enhanced_output_style_detector.py +5 -5
- moai_adk/statusline/main.py +20 -1
- moai_adk/statusline/memory_collector.py +268 -0
- moai_adk/statusline/renderer.py +54 -38
- moai_adk/tag_system/__init__.py +48 -0
- moai_adk/tag_system/atomic_ops.py +117 -0
- moai_adk/tag_system/linkage.py +335 -0
- moai_adk/tag_system/parser.py +176 -0
- moai_adk/tag_system/validator.py +200 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
- moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
- moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
- moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
- moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
- moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
- moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
- moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
- moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
- moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
- moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
- moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
- moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
- moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
- moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
- moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
- moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
- moai_adk/templates/.claude/commands/moai/fix.md +264 -0
- moai_adk/templates/.claude/commands/moai/loop.md +363 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
- moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
- moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -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.py +376 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
- moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
- moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
- moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
- moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
- moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
- 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/renderer.py +359 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
- moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
- moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
- moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
- moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
- moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
- moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
- moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
- moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
- moai_adk/templates/.claude/settings.json +154 -77
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
- 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 +226 -320
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
- 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-uiux/SKILL.md +118 -339
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
- 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-custom-slash-commands-official.md +32 -22
- 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-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -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-context/SKILL.md +96 -316
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
- 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-philosopher/SKILL.md +14 -18
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
- moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -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 +1136 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
- 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 +65 -542
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -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 +889 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -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 +42 -279
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -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 +1323 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -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 +1087 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -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 +1024 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
- 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-swift/SKILL.md +88 -457
- 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-typescript/SKILL.md +75 -283
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
- 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-shadcn/SKILL.md +90 -287
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
- 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 +75 -330
- moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -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 +100 -340
- 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 +113 -326
- 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 +71 -302
- 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 +101 -412
- 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 +96 -327
- 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 +103 -428
- 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 +96 -446
- 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-tool-ast-grep/SKILL.md +193 -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-workflow-jit-docs/SKILL.md +225 -423
- moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
- 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-worktree/SKILL.md +228 -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 +162 -59
- moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
- moai_adk/templates/.gitignore +65 -107
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +2 -20
- moai_adk/templates/.moai/announcements/en.json +18 -0
- moai_adk/templates/.moai/announcements/ja.json +18 -0
- moai_adk/templates/.moai/announcements/ko.json +18 -0
- moai_adk/templates/.moai/announcements/zh.json +18 -0
- moai_adk/templates/.moai/config/config.yaml +8 -2
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/sections/language.yaml +2 -2
- moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
- moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
- moai_adk/templates/.moai/config/sections/project.yaml +2 -2
- moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
- moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
- moai_adk/templates/.moai/config/sections/system.yaml +46 -1
- moai_adk/templates/.moai/config/sections/user.yaml +1 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
- moai_adk/templates/.moai/llm-configs/glm.json +22 -0
- moai_adk/templates/CLAUDE.ja.md +343 -0
- moai_adk/templates/CLAUDE.ko.md +343 -0
- moai_adk/templates/CLAUDE.md +200 -499
- moai_adk/templates/CLAUDE.zh.md +343 -0
- moai_adk/utils/common.py +37 -0
- moai_adk/version.py +1 -1
- moai_adk-1.1.0.dist-info/METADATA +2443 -0
- moai_adk-1.1.0.dist-info/RECORD +701 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
- moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -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/agents/moai/ai-nano-banana.md +0 -670
- moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
- 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 -175
- 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 -411
- 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/config/questions/_schema.yaml +0 -151
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
- moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
- moai_adk-0.34.0.dist-info/METADATA +0 -2999
- moai_adk-0.34.0.dist-info/RECORD +0 -463
- moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
- /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
- /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.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: realtime-presence
|
|
3
|
+
description: Real-time subscriptions and presence tracking for collaborative features
|
|
4
|
+
parent-skill: moai-platform-supabase
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
updated: 2026-01-06
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Real-time and Presence Module
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
Supabase provides real-time capabilities through Postgres Changes (database change notifications) and Presence (user state tracking) for building collaborative applications.
|
|
14
|
+
|
|
15
|
+
## Postgres Changes Subscription
|
|
16
|
+
|
|
17
|
+
### Basic Setup
|
|
18
|
+
|
|
19
|
+
Subscribe to all changes on a table:
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { createClient } from '@supabase/supabase-js'
|
|
23
|
+
|
|
24
|
+
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY)
|
|
25
|
+
|
|
26
|
+
const channel = supabase.channel('db-changes')
|
|
27
|
+
.on('postgres_changes',
|
|
28
|
+
{ event: '*', schema: 'public', table: 'messages' },
|
|
29
|
+
(payload) => console.log('Change:', payload)
|
|
30
|
+
)
|
|
31
|
+
.subscribe()
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Event Types
|
|
35
|
+
|
|
36
|
+
Available events:
|
|
37
|
+
- `INSERT` - New row added
|
|
38
|
+
- `UPDATE` - Row modified
|
|
39
|
+
- `DELETE` - Row removed
|
|
40
|
+
- `*` - All events
|
|
41
|
+
|
|
42
|
+
### Filtered Subscriptions
|
|
43
|
+
|
|
44
|
+
Filter changes by specific conditions:
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
supabase.channel('project-updates')
|
|
48
|
+
.on('postgres_changes',
|
|
49
|
+
{
|
|
50
|
+
event: 'UPDATE',
|
|
51
|
+
schema: 'public',
|
|
52
|
+
table: 'projects',
|
|
53
|
+
filter: `id=eq.${projectId}`
|
|
54
|
+
},
|
|
55
|
+
(payload) => handleProjectUpdate(payload.new)
|
|
56
|
+
)
|
|
57
|
+
.subscribe()
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Multiple Tables
|
|
61
|
+
|
|
62
|
+
Subscribe to multiple tables on one channel:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
const channel = supabase.channel('app-changes')
|
|
66
|
+
.on('postgres_changes',
|
|
67
|
+
{ event: '*', schema: 'public', table: 'tasks' },
|
|
68
|
+
handleTaskChange
|
|
69
|
+
)
|
|
70
|
+
.on('postgres_changes',
|
|
71
|
+
{ event: '*', schema: 'public', table: 'comments' },
|
|
72
|
+
handleCommentChange
|
|
73
|
+
)
|
|
74
|
+
.subscribe()
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Presence Tracking
|
|
78
|
+
|
|
79
|
+
### Presence State Interface
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
interface PresenceState {
|
|
83
|
+
user_id: string
|
|
84
|
+
online_at: string
|
|
85
|
+
typing?: boolean
|
|
86
|
+
cursor?: { x: number; y: number }
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Channel Setup with Presence
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
const channel = supabase.channel('room:collaborative-doc', {
|
|
94
|
+
config: { presence: { key: userId } }
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
channel
|
|
98
|
+
.on('presence', { event: 'sync' }, () => {
|
|
99
|
+
const state = channel.presenceState<PresenceState>()
|
|
100
|
+
console.log('Online users:', Object.keys(state))
|
|
101
|
+
})
|
|
102
|
+
.on('presence', { event: 'join' }, ({ key, newPresences }) => {
|
|
103
|
+
console.log('User joined:', key, newPresences)
|
|
104
|
+
})
|
|
105
|
+
.on('presence', { event: 'leave' }, ({ key, leftPresences }) => {
|
|
106
|
+
console.log('User left:', key, leftPresences)
|
|
107
|
+
})
|
|
108
|
+
.subscribe(async (status) => {
|
|
109
|
+
if (status === 'SUBSCRIBED') {
|
|
110
|
+
await channel.track({
|
|
111
|
+
user_id: userId,
|
|
112
|
+
online_at: new Date().toISOString()
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Update Presence State
|
|
119
|
+
|
|
120
|
+
Update user presence in real-time:
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// Track typing status
|
|
124
|
+
await channel.track({ typing: true })
|
|
125
|
+
|
|
126
|
+
// Track cursor position
|
|
127
|
+
await channel.track({ cursor: { x: 100, y: 200 } })
|
|
128
|
+
|
|
129
|
+
// Clear typing after timeout
|
|
130
|
+
setTimeout(async () => {
|
|
131
|
+
await channel.track({ typing: false })
|
|
132
|
+
}, 1000)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Collaborative Features
|
|
136
|
+
|
|
137
|
+
### Collaborative Cursors
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
interface CursorState {
|
|
141
|
+
user_id: string
|
|
142
|
+
user_name: string
|
|
143
|
+
cursor: { x: number; y: number }
|
|
144
|
+
color: string
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function setupCollaborativeCursors(documentId: string, userId: string, userName: string) {
|
|
148
|
+
const channel = supabase.channel(`cursors:${documentId}`, {
|
|
149
|
+
config: { presence: { key: userId } }
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
const colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7']
|
|
153
|
+
const userColor = colors[Math.abs(userId.hashCode()) % colors.length]
|
|
154
|
+
|
|
155
|
+
channel
|
|
156
|
+
.on('presence', { event: 'sync' }, () => {
|
|
157
|
+
const state = channel.presenceState<CursorState>()
|
|
158
|
+
renderCursors(Object.values(state).flat())
|
|
159
|
+
})
|
|
160
|
+
.subscribe(async (status) => {
|
|
161
|
+
if (status === 'SUBSCRIBED') {
|
|
162
|
+
await channel.track({
|
|
163
|
+
user_id: userId,
|
|
164
|
+
user_name: userName,
|
|
165
|
+
cursor: { x: 0, y: 0 },
|
|
166
|
+
color: userColor
|
|
167
|
+
})
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
// Track mouse movement
|
|
172
|
+
document.addEventListener('mousemove', async (e) => {
|
|
173
|
+
await channel.track({
|
|
174
|
+
user_id: userId,
|
|
175
|
+
user_name: userName,
|
|
176
|
+
cursor: { x: e.clientX, y: e.clientY },
|
|
177
|
+
color: userColor
|
|
178
|
+
})
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
return channel
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Live Editing Indicators
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
interface EditingState {
|
|
189
|
+
user_id: string
|
|
190
|
+
user_name: string
|
|
191
|
+
editing_field: string | null
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function setupFieldLocking(formId: string) {
|
|
195
|
+
const channel = supabase.channel(`form:${formId}`, {
|
|
196
|
+
config: { presence: { key: currentUserId } }
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
channel
|
|
200
|
+
.on('presence', { event: 'sync' }, () => {
|
|
201
|
+
const state = channel.presenceState<EditingState>()
|
|
202
|
+
updateFieldLocks(Object.values(state).flat())
|
|
203
|
+
})
|
|
204
|
+
.subscribe()
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
startEditing: async (fieldName: string) => {
|
|
208
|
+
await channel.track({
|
|
209
|
+
user_id: currentUserId,
|
|
210
|
+
user_name: currentUserName,
|
|
211
|
+
editing_field: fieldName
|
|
212
|
+
})
|
|
213
|
+
},
|
|
214
|
+
stopEditing: async () => {
|
|
215
|
+
await channel.track({
|
|
216
|
+
user_id: currentUserId,
|
|
217
|
+
user_name: currentUserName,
|
|
218
|
+
editing_field: null
|
|
219
|
+
})
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Broadcast Messages
|
|
226
|
+
|
|
227
|
+
Send arbitrary messages to channel subscribers:
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
const channel = supabase.channel('room:chat')
|
|
231
|
+
|
|
232
|
+
// Subscribe to broadcasts
|
|
233
|
+
channel
|
|
234
|
+
.on('broadcast', { event: 'message' }, ({ payload }) => {
|
|
235
|
+
console.log('Received:', payload)
|
|
236
|
+
})
|
|
237
|
+
.subscribe()
|
|
238
|
+
|
|
239
|
+
// Send broadcast
|
|
240
|
+
await channel.send({
|
|
241
|
+
type: 'broadcast',
|
|
242
|
+
event: 'message',
|
|
243
|
+
payload: { text: 'Hello everyone!', sender: userId }
|
|
244
|
+
})
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Subscription Management
|
|
248
|
+
|
|
249
|
+
### Unsubscribe
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
// Unsubscribe from specific channel
|
|
253
|
+
await supabase.removeChannel(channel)
|
|
254
|
+
|
|
255
|
+
// Unsubscribe from all channels
|
|
256
|
+
await supabase.removeAllChannels()
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Subscription Status
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
channel.subscribe((status) => {
|
|
263
|
+
switch (status) {
|
|
264
|
+
case 'SUBSCRIBED':
|
|
265
|
+
console.log('Connected to channel')
|
|
266
|
+
break
|
|
267
|
+
case 'CLOSED':
|
|
268
|
+
console.log('Channel closed')
|
|
269
|
+
break
|
|
270
|
+
case 'CHANNEL_ERROR':
|
|
271
|
+
console.log('Channel error')
|
|
272
|
+
break
|
|
273
|
+
case 'TIMED_OUT':
|
|
274
|
+
console.log('Connection timed out')
|
|
275
|
+
break
|
|
276
|
+
}
|
|
277
|
+
})
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## React Integration
|
|
281
|
+
|
|
282
|
+
### Custom Hook for Presence
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
import { useEffect, useState } from 'react'
|
|
286
|
+
import { supabase } from './supabase/client'
|
|
287
|
+
|
|
288
|
+
export function usePresence<T>(channelName: string, userId: string, initialState: T) {
|
|
289
|
+
const [presences, setPresences] = useState<Record<string, T[]>>({})
|
|
290
|
+
|
|
291
|
+
useEffect(() => {
|
|
292
|
+
const channel = supabase.channel(channelName, {
|
|
293
|
+
config: { presence: { key: userId } }
|
|
294
|
+
})
|
|
295
|
+
|
|
296
|
+
channel
|
|
297
|
+
.on('presence', { event: 'sync' }, () => {
|
|
298
|
+
setPresences(channel.presenceState<T>())
|
|
299
|
+
})
|
|
300
|
+
.subscribe(async (status) => {
|
|
301
|
+
if (status === 'SUBSCRIBED') {
|
|
302
|
+
await channel.track(initialState)
|
|
303
|
+
}
|
|
304
|
+
})
|
|
305
|
+
|
|
306
|
+
return () => {
|
|
307
|
+
supabase.removeChannel(channel)
|
|
308
|
+
}
|
|
309
|
+
}, [channelName, userId])
|
|
310
|
+
|
|
311
|
+
const updatePresence = async (state: Partial<T>) => {
|
|
312
|
+
const channel = supabase.getChannels().find(c => c.topic === channelName)
|
|
313
|
+
if (channel) {
|
|
314
|
+
await channel.track({ ...initialState, ...state } as T)
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return { presences, updatePresence }
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Usage
|
|
323
|
+
|
|
324
|
+
```typescript
|
|
325
|
+
function CollaborativeEditor({ documentId, userId }) {
|
|
326
|
+
const { presences, updatePresence } = usePresence(
|
|
327
|
+
`doc:${documentId}`,
|
|
328
|
+
userId,
|
|
329
|
+
{ user_id: userId, typing: false, cursor: null }
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
return (
|
|
333
|
+
<div>
|
|
334
|
+
{Object.values(presences).flat().map(p => (
|
|
335
|
+
<Cursor key={p.user_id} position={p.cursor} />
|
|
336
|
+
))}
|
|
337
|
+
</div>
|
|
338
|
+
)
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Context7 Query Examples
|
|
343
|
+
|
|
344
|
+
For latest real-time documentation:
|
|
345
|
+
|
|
346
|
+
Topic: "realtime postgres_changes subscription"
|
|
347
|
+
Topic: "presence tracking channel"
|
|
348
|
+
Topic: "broadcast messages supabase"
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
Related Modules:
|
|
353
|
+
- typescript-patterns.md - Client architecture
|
|
354
|
+
- auth-integration.md - Authenticated subscriptions
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: row-level-security
|
|
3
|
+
description: RLS policies for multi-tenant data isolation and access control
|
|
4
|
+
parent-skill: moai-platform-supabase
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
updated: 2026-01-06
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Row-Level Security (RLS) Module
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
Row-Level Security provides automatic data isolation at the database level, ensuring users can only access data they are authorized to see.
|
|
14
|
+
|
|
15
|
+
## Basic Setup
|
|
16
|
+
|
|
17
|
+
Enable RLS on a table:
|
|
18
|
+
|
|
19
|
+
```sql
|
|
20
|
+
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Policy Types
|
|
24
|
+
|
|
25
|
+
RLS policies can be created for specific operations:
|
|
26
|
+
|
|
27
|
+
- SELECT: Controls read access
|
|
28
|
+
- INSERT: Controls creation
|
|
29
|
+
- UPDATE: Controls modification
|
|
30
|
+
- DELETE: Controls removal
|
|
31
|
+
- ALL: Applies to all operations
|
|
32
|
+
|
|
33
|
+
## Basic Tenant Isolation
|
|
34
|
+
|
|
35
|
+
### JWT-Based Tenant Isolation
|
|
36
|
+
|
|
37
|
+
Extract tenant ID from JWT claims:
|
|
38
|
+
|
|
39
|
+
```sql
|
|
40
|
+
CREATE POLICY "tenant_isolation" ON projects FOR ALL
|
|
41
|
+
USING (tenant_id = (auth.jwt() ->> 'tenant_id')::UUID);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Owner-Based Access
|
|
45
|
+
|
|
46
|
+
Restrict access to resource owners:
|
|
47
|
+
|
|
48
|
+
```sql
|
|
49
|
+
CREATE POLICY "owner_access" ON projects FOR ALL
|
|
50
|
+
USING (owner_id = auth.uid());
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Hierarchical Access Patterns
|
|
54
|
+
|
|
55
|
+
### Organization Membership
|
|
56
|
+
|
|
57
|
+
Allow access based on organization membership:
|
|
58
|
+
|
|
59
|
+
```sql
|
|
60
|
+
CREATE POLICY "org_member_select" ON organizations FOR SELECT
|
|
61
|
+
USING (id IN (SELECT org_id FROM org_members WHERE user_id = auth.uid()));
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Role-Based Modification
|
|
65
|
+
|
|
66
|
+
Restrict modifications to specific roles:
|
|
67
|
+
|
|
68
|
+
```sql
|
|
69
|
+
CREATE POLICY "org_admin_modify" ON organizations FOR UPDATE
|
|
70
|
+
USING (id IN (
|
|
71
|
+
SELECT org_id FROM org_members
|
|
72
|
+
WHERE user_id = auth.uid() AND role IN ('owner', 'admin')
|
|
73
|
+
));
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Cascading Project Access
|
|
77
|
+
|
|
78
|
+
Grant project access through organization membership:
|
|
79
|
+
|
|
80
|
+
```sql
|
|
81
|
+
CREATE POLICY "project_access" ON projects FOR ALL
|
|
82
|
+
USING (org_id IN (SELECT org_id FROM org_members WHERE user_id = auth.uid()));
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Service Role Bypass
|
|
86
|
+
|
|
87
|
+
Allow service role to bypass RLS for server-side operations:
|
|
88
|
+
|
|
89
|
+
```sql
|
|
90
|
+
CREATE POLICY "service_bypass" ON organizations FOR ALL TO service_role USING (true);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Multi-Tenant SaaS Schema
|
|
94
|
+
|
|
95
|
+
### Complete Schema Setup
|
|
96
|
+
|
|
97
|
+
```sql
|
|
98
|
+
-- Organizations (tenants)
|
|
99
|
+
CREATE TABLE organizations (
|
|
100
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
101
|
+
name TEXT NOT NULL,
|
|
102
|
+
slug TEXT UNIQUE NOT NULL,
|
|
103
|
+
plan TEXT DEFAULT 'free' CHECK (plan IN ('free', 'pro', 'enterprise')),
|
|
104
|
+
settings JSONB DEFAULT '{}',
|
|
105
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
-- Organization members with roles
|
|
109
|
+
CREATE TABLE organization_members (
|
|
110
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
111
|
+
organization_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
|
|
112
|
+
user_id UUID NOT NULL,
|
|
113
|
+
role TEXT NOT NULL CHECK (role IN ('owner', 'admin', 'member', 'viewer')),
|
|
114
|
+
joined_at TIMESTAMPTZ DEFAULT NOW(),
|
|
115
|
+
UNIQUE(organization_id, user_id)
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
-- Projects within organizations
|
|
119
|
+
CREATE TABLE projects (
|
|
120
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
121
|
+
organization_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
|
|
122
|
+
name TEXT NOT NULL,
|
|
123
|
+
owner_id UUID NOT NULL,
|
|
124
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
125
|
+
);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Enable RLS on All Tables
|
|
129
|
+
|
|
130
|
+
```sql
|
|
131
|
+
ALTER TABLE organizations ENABLE ROW LEVEL SECURITY;
|
|
132
|
+
ALTER TABLE organization_members ENABLE ROW LEVEL SECURITY;
|
|
133
|
+
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Comprehensive RLS Policies
|
|
137
|
+
|
|
138
|
+
```sql
|
|
139
|
+
-- Organization read access
|
|
140
|
+
CREATE POLICY "org_member_select" ON organizations FOR SELECT
|
|
141
|
+
USING (id IN (SELECT organization_id FROM organization_members WHERE user_id = auth.uid()));
|
|
142
|
+
|
|
143
|
+
-- Organization admin update
|
|
144
|
+
CREATE POLICY "org_admin_update" ON organizations FOR UPDATE
|
|
145
|
+
USING (id IN (SELECT organization_id FROM organization_members
|
|
146
|
+
WHERE user_id = auth.uid() AND role IN ('owner', 'admin')));
|
|
147
|
+
|
|
148
|
+
-- Project member access
|
|
149
|
+
CREATE POLICY "project_member_access" ON projects FOR ALL
|
|
150
|
+
USING (organization_id IN (SELECT organization_id FROM organization_members WHERE user_id = auth.uid()));
|
|
151
|
+
|
|
152
|
+
-- Member management (admin only)
|
|
153
|
+
CREATE POLICY "member_admin_manage" ON organization_members FOR ALL
|
|
154
|
+
USING (organization_id IN (SELECT organization_id FROM organization_members
|
|
155
|
+
WHERE user_id = auth.uid() AND role IN ('owner', 'admin')));
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Helper Functions
|
|
159
|
+
|
|
160
|
+
### Check Organization Membership
|
|
161
|
+
|
|
162
|
+
```sql
|
|
163
|
+
CREATE OR REPLACE FUNCTION is_org_member(org_id UUID)
|
|
164
|
+
RETURNS BOOLEAN AS $$
|
|
165
|
+
BEGIN
|
|
166
|
+
RETURN EXISTS (
|
|
167
|
+
SELECT 1 FROM organization_members
|
|
168
|
+
WHERE organization_id = org_id AND user_id = auth.uid()
|
|
169
|
+
);
|
|
170
|
+
END;
|
|
171
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Check Organization Role
|
|
175
|
+
|
|
176
|
+
```sql
|
|
177
|
+
CREATE OR REPLACE FUNCTION has_org_role(org_id UUID, required_roles TEXT[])
|
|
178
|
+
RETURNS BOOLEAN AS $$
|
|
179
|
+
BEGIN
|
|
180
|
+
RETURN EXISTS (
|
|
181
|
+
SELECT 1 FROM organization_members
|
|
182
|
+
WHERE organization_id = org_id
|
|
183
|
+
AND user_id = auth.uid()
|
|
184
|
+
AND role = ANY(required_roles)
|
|
185
|
+
);
|
|
186
|
+
END;
|
|
187
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Usage in Policies
|
|
191
|
+
|
|
192
|
+
```sql
|
|
193
|
+
CREATE POLICY "project_admin_delete" ON projects FOR DELETE
|
|
194
|
+
USING (has_org_role(organization_id, ARRAY['owner', 'admin']));
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Performance Optimization
|
|
198
|
+
|
|
199
|
+
### Index for RLS Queries
|
|
200
|
+
|
|
201
|
+
Create indexes on foreign keys used in RLS policies:
|
|
202
|
+
|
|
203
|
+
```sql
|
|
204
|
+
CREATE INDEX idx_org_members_user ON organization_members(user_id);
|
|
205
|
+
CREATE INDEX idx_org_members_org ON organization_members(organization_id);
|
|
206
|
+
CREATE INDEX idx_projects_org ON projects(organization_id);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Materialized View for Complex Policies
|
|
210
|
+
|
|
211
|
+
For complex permission checks, use materialized views:
|
|
212
|
+
|
|
213
|
+
```sql
|
|
214
|
+
CREATE MATERIALIZED VIEW user_accessible_projects AS
|
|
215
|
+
SELECT p.id as project_id, om.user_id, om.role
|
|
216
|
+
FROM projects p
|
|
217
|
+
JOIN organization_members om ON p.organization_id = om.organization_id;
|
|
218
|
+
|
|
219
|
+
CREATE INDEX idx_uap_user ON user_accessible_projects(user_id);
|
|
220
|
+
|
|
221
|
+
REFRESH MATERIALIZED VIEW CONCURRENTLY user_accessible_projects;
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Testing RLS Policies
|
|
225
|
+
|
|
226
|
+
### Test as Authenticated User
|
|
227
|
+
|
|
228
|
+
```sql
|
|
229
|
+
SET request.jwt.claim.sub = 'user-uuid-here';
|
|
230
|
+
SET request.jwt.claims = '{"role": "authenticated"}';
|
|
231
|
+
|
|
232
|
+
SELECT * FROM projects; -- Returns only accessible projects
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Verify Policy Restrictions
|
|
236
|
+
|
|
237
|
+
```sql
|
|
238
|
+
-- Should fail if not a member
|
|
239
|
+
INSERT INTO projects (organization_id, name, owner_id)
|
|
240
|
+
VALUES ('non-member-org-id', 'Test', auth.uid());
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Common Patterns
|
|
244
|
+
|
|
245
|
+
### Public Read, Owner Write
|
|
246
|
+
|
|
247
|
+
```sql
|
|
248
|
+
CREATE POLICY "public_read" ON posts FOR SELECT USING (true);
|
|
249
|
+
CREATE POLICY "owner_write" ON posts FOR INSERT WITH CHECK (author_id = auth.uid());
|
|
250
|
+
CREATE POLICY "owner_update" ON posts FOR UPDATE USING (author_id = auth.uid());
|
|
251
|
+
CREATE POLICY "owner_delete" ON posts FOR DELETE USING (author_id = auth.uid());
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Draft vs Published
|
|
255
|
+
|
|
256
|
+
```sql
|
|
257
|
+
CREATE POLICY "published_read" ON articles FOR SELECT
|
|
258
|
+
USING (status = 'published' OR author_id = auth.uid());
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Time-Based Access
|
|
262
|
+
|
|
263
|
+
```sql
|
|
264
|
+
CREATE POLICY "active_subscription" ON premium_content FOR SELECT
|
|
265
|
+
USING (
|
|
266
|
+
EXISTS (
|
|
267
|
+
SELECT 1 FROM subscriptions
|
|
268
|
+
WHERE user_id = auth.uid()
|
|
269
|
+
AND expires_at > NOW()
|
|
270
|
+
)
|
|
271
|
+
);
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Context7 Query Examples
|
|
275
|
+
|
|
276
|
+
For latest RLS documentation:
|
|
277
|
+
|
|
278
|
+
Topic: "row level security policies supabase"
|
|
279
|
+
Topic: "auth.uid auth.jwt functions"
|
|
280
|
+
Topic: "rls performance optimization"
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
Related Modules:
|
|
285
|
+
- auth-integration.md - Authentication patterns
|
|
286
|
+
- typescript-patterns.md - Client-side access patterns
|