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.
Files changed (524) hide show
  1. moai_adk/__main__.py +136 -5
  2. moai_adk/astgrep/__init__.py +37 -0
  3. moai_adk/astgrep/analyzer.py +522 -0
  4. moai_adk/astgrep/models.py +124 -0
  5. moai_adk/astgrep/rules.py +179 -0
  6. moai_adk/cli/commands/analyze.py +11 -2
  7. moai_adk/cli/commands/doctor.py +7 -1
  8. moai_adk/cli/commands/init.py +321 -11
  9. moai_adk/cli/commands/language.py +7 -1
  10. moai_adk/cli/commands/rank.py +449 -0
  11. moai_adk/cli/commands/status.py +7 -1
  12. moai_adk/cli/commands/switch.py +325 -0
  13. moai_adk/cli/commands/update.py +296 -23
  14. moai_adk/cli/prompts/init_prompts.py +362 -66
  15. moai_adk/cli/prompts/translations/__init__.py +573 -0
  16. moai_adk/cli/ui/prompts.py +61 -2
  17. moai_adk/cli/worktree/cli.py +106 -1
  18. moai_adk/cli/worktree/manager.py +155 -0
  19. moai_adk/core/config/unified.py +244 -63
  20. moai_adk/core/credentials.py +264 -0
  21. moai_adk/core/error_recovery_system.py +22 -4
  22. moai_adk/core/git/conflict_detector.py +10 -1
  23. moai_adk/core/git/event_detector.py +16 -5
  24. moai_adk/core/integration/engine.py +2 -2
  25. moai_adk/core/integration/integration_tester.py +5 -5
  26. moai_adk/core/language_config_resolver.py +9 -3
  27. moai_adk/core/merge/analyzer.py +509 -324
  28. moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
  29. moai_adk/core/migration/backup_manager.py +54 -4
  30. moai_adk/core/migration/file_migrator.py +174 -2
  31. moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
  32. moai_adk/core/migration/version_detector.py +123 -19
  33. moai_adk/core/migration/version_migrator.py +44 -9
  34. moai_adk/core/model_allocator.py +241 -0
  35. moai_adk/core/project/backup_utils.py +12 -2
  36. moai_adk/core/project/initializer.py +44 -87
  37. moai_adk/core/project/phase_executor.py +95 -33
  38. moai_adk/core/project/validator.py +16 -1
  39. moai_adk/core/quality/trust_checker.py +30 -10
  40. moai_adk/core/rollback_manager.py +60 -25
  41. moai_adk/core/template/backup.py +88 -6
  42. moai_adk/core/template/config.py +33 -9
  43. moai_adk/core/template/merger.py +34 -8
  44. moai_adk/core/template/processor.py +334 -11
  45. moai_adk/core/template_engine.py +10 -1
  46. moai_adk/core/template_variable_synchronizer.py +16 -2
  47. moai_adk/core/version_sync.py +54 -6
  48. moai_adk/foundation/__init__.py +1 -20
  49. moai_adk/foundation/testing.py +1 -1
  50. moai_adk/loop/__init__.py +54 -0
  51. moai_adk/loop/controller.py +305 -0
  52. moai_adk/loop/feedback.py +230 -0
  53. moai_adk/loop/state.py +209 -0
  54. moai_adk/loop/storage.py +220 -0
  55. moai_adk/lsp/__init__.py +70 -0
  56. moai_adk/lsp/client.py +320 -0
  57. moai_adk/lsp/models.py +261 -0
  58. moai_adk/lsp/protocol.py +404 -0
  59. moai_adk/lsp/server_manager.py +248 -0
  60. moai_adk/project/configuration.py +8 -1
  61. moai_adk/py.typed +0 -0
  62. moai_adk/ralph/__init__.py +37 -0
  63. moai_adk/ralph/engine.py +307 -0
  64. moai_adk/rank/__init__.py +21 -0
  65. moai_adk/rank/auth.py +425 -0
  66. moai_adk/rank/client.py +557 -0
  67. moai_adk/rank/config.py +147 -0
  68. moai_adk/rank/hook.py +1503 -0
  69. moai_adk/rank/py.typed +0 -0
  70. moai_adk/statusline/__init__.py +3 -0
  71. moai_adk/statusline/enhanced_output_style_detector.py +5 -5
  72. moai_adk/statusline/main.py +20 -1
  73. moai_adk/statusline/memory_collector.py +268 -0
  74. moai_adk/statusline/renderer.py +54 -38
  75. moai_adk/tag_system/__init__.py +48 -0
  76. moai_adk/tag_system/atomic_ops.py +117 -0
  77. moai_adk/tag_system/linkage.py +335 -0
  78. moai_adk/tag_system/parser.py +176 -0
  79. moai_adk/tag_system/validator.py +200 -0
  80. moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
  81. moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
  82. moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
  83. moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
  84. moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
  85. moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
  86. moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
  87. moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
  88. moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
  89. moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
  90. moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
  91. moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
  92. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
  93. moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
  94. moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
  95. moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
  96. moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
  97. moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
  98. moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
  99. moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
  100. moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
  101. moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
  102. moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
  103. moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
  104. moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
  105. moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
  106. moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
  107. moai_adk/templates/.claude/commands/moai/fix.md +264 -0
  108. moai_adk/templates/.claude/commands/moai/loop.md +363 -0
  109. moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
  110. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
  111. moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
  112. moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
  113. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
  114. moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
  115. moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
  116. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
  117. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
  118. moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
  119. moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
  120. moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
  121. moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
  122. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
  123. moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
  124. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
  125. moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
  126. moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
  127. moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
  128. moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
  129. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
  130. moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
  131. moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
  132. moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
  133. moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
  134. moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
  135. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
  136. moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
  137. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
  138. moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
  139. moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
  140. moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
  141. moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
  142. moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
  143. moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
  144. moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
  145. moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
  146. moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
  147. moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
  148. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
  149. moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
  150. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
  151. moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
  152. moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
  153. moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
  154. moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
  155. moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
  156. moai_adk/templates/.claude/settings.json +154 -77
  157. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
  158. moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
  159. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
  160. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
  161. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
  162. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
  163. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
  164. moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +226 -320
  165. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
  166. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
  167. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
  168. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
  169. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
  170. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
  171. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
  172. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
  173. moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
  174. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +118 -339
  175. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
  176. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
  177. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
  178. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
  179. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
  180. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +32 -22
  181. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
  182. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
  183. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
  184. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
  185. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
  186. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
  187. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
  188. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
  189. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
  190. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
  191. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +96 -316
  192. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
  193. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
  194. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
  195. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
  196. moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
  197. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
  198. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
  199. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
  200. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
  201. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
  202. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
  203. moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +14 -18
  204. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
  205. moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
  206. moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
  207. moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
  208. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
  209. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -0
  210. moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
  211. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1136 -0
  212. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
  213. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
  214. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
  215. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
  216. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
  217. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
  218. moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
  219. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
  220. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +65 -542
  221. moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
  222. moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
  223. moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
  224. moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
  225. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
  226. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
  227. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -0
  228. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
  229. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
  230. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +42 -279
  231. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
  232. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -0
  233. moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
  234. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1323 -0
  235. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
  236. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
  237. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -0
  238. moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
  239. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1087 -0
  240. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
  241. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -0
  242. moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
  243. moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
  244. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1024 -0
  245. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
  246. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
  247. moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
  248. moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
  249. moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
  250. moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
  251. moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
  252. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -457
  253. moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
  254. moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
  255. moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
  256. moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
  257. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +75 -283
  258. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
  259. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
  260. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
  261. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
  262. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +90 -287
  263. moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
  264. moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
  265. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
  266. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
  267. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
  268. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
  269. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
  270. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
  271. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
  272. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
  273. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
  274. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
  275. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
  276. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
  277. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
  278. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
  279. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
  280. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
  281. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
  282. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
  283. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
  284. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
  285. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
  286. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
  287. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
  288. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
  289. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
  290. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
  291. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
  292. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
  293. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
  294. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
  295. moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
  296. moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
  297. moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +75 -330
  298. moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
  299. moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
  300. moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
  301. moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +100 -340
  302. moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
  303. moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
  304. moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
  305. moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
  306. moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
  307. moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
  308. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +113 -326
  309. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
  310. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
  311. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
  312. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
  313. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
  314. moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +71 -302
  315. moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
  316. moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
  317. moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
  318. moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
  319. moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
  320. moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
  321. moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +101 -412
  322. moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
  323. moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
  324. moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
  325. moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
  326. moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
  327. moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
  328. moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +96 -327
  329. moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
  330. moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
  331. moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
  332. moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
  333. moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
  334. moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
  335. moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +103 -428
  336. moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
  337. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
  338. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
  339. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
  340. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
  341. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
  342. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
  343. moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
  344. moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
  345. moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +96 -446
  346. moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
  347. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
  348. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
  349. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
  350. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
  351. moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
  352. moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
  353. moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
  354. moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
  355. moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
  356. moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
  357. moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
  358. moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
  359. moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
  360. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
  361. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
  362. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
  363. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
  364. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
  365. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
  366. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
  367. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
  368. moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
  369. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +225 -423
  370. moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
  371. moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
  372. moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
  373. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
  374. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
  375. moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
  376. moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
  377. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
  378. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
  379. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
  380. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
  381. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
  382. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
  383. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
  384. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
  385. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
  386. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
  387. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
  388. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
  389. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
  390. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
  391. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
  392. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
  393. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
  394. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
  395. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
  396. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
  397. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
  398. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
  399. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
  400. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
  401. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
  402. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
  403. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
  404. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
  405. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
  406. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
  407. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
  408. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
  409. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
  410. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
  411. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
  412. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
  413. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
  414. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
  415. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
  416. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
  417. moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +228 -0
  418. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
  419. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
  420. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
  421. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
  422. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
  423. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
  424. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
  425. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
  426. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
  427. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
  428. moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
  429. moai_adk/templates/.git-hooks/pre-push +162 -59
  430. moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
  431. moai_adk/templates/.gitignore +65 -107
  432. moai_adk/templates/.lsp.json +152 -0
  433. moai_adk/templates/.mcp.json +2 -20
  434. moai_adk/templates/.moai/announcements/en.json +18 -0
  435. moai_adk/templates/.moai/announcements/ja.json +18 -0
  436. moai_adk/templates/.moai/announcements/ko.json +18 -0
  437. moai_adk/templates/.moai/announcements/zh.json +18 -0
  438. moai_adk/templates/.moai/config/config.yaml +8 -2
  439. moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
  440. moai_adk/templates/.moai/config/sections/language.yaml +2 -2
  441. moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
  442. moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
  443. moai_adk/templates/.moai/config/sections/project.yaml +2 -2
  444. moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
  445. moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
  446. moai_adk/templates/.moai/config/sections/system.yaml +46 -1
  447. moai_adk/templates/.moai/config/sections/user.yaml +1 -1
  448. moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
  449. moai_adk/templates/.moai/llm-configs/glm.json +22 -0
  450. moai_adk/templates/CLAUDE.ja.md +343 -0
  451. moai_adk/templates/CLAUDE.ko.md +343 -0
  452. moai_adk/templates/CLAUDE.md +200 -499
  453. moai_adk/templates/CLAUDE.zh.md +343 -0
  454. moai_adk/utils/common.py +37 -0
  455. moai_adk/version.py +1 -1
  456. moai_adk-1.1.0.dist-info/METADATA +2443 -0
  457. moai_adk-1.1.0.dist-info/RECORD +701 -0
  458. {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
  459. moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -0
  460. moai_adk/core/config/auto_spec_config.py +0 -340
  461. moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
  462. moai_adk/core/spec/confidence_scoring.py +0 -680
  463. moai_adk/core/spec/ears_template_engine.py +0 -1247
  464. moai_adk/core/spec/quality_validator.py +0 -687
  465. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +0 -670
  466. moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
  467. moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
  468. moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
  469. moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
  470. moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
  471. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
  472. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
  473. moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
  474. moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
  475. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
  476. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
  477. moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
  478. moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
  479. moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
  480. moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
  481. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
  482. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
  483. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
  484. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
  485. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
  486. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -175
  487. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
  488. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
  489. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
  490. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
  491. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
  492. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
  493. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
  494. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
  495. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
  496. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
  497. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
  498. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -411
  499. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
  500. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
  501. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
  502. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
  503. moai_adk/templates/.moai/config/questions/_schema.yaml +0 -151
  504. moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
  505. moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
  506. moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
  507. moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
  508. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
  509. moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
  510. moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
  511. moai_adk-0.34.0.dist-info/METADATA +0 -2999
  512. moai_adk-0.34.0.dist-info/RECORD +0 -463
  513. moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
  514. /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
  515. /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
  516. /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
  517. /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
  518. /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
  519. /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
  520. /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
  521. /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
  522. /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
  523. /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
  524. {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,1426 @@
1
+ # Clerk Authentication - Working Examples
2
+
3
+ Complete working examples for Clerk authentication in Next.js 15 with React 19 and TypeScript.
4
+
5
+ ---
6
+
7
+ ## 1. Basic Setup
8
+
9
+ ### Next.js App Router with Clerk Provider
10
+
11
+ Complete project initialization with environment setup:
12
+
13
+ ```bash
14
+ # Install dependencies
15
+ npm install @clerk/nextjs
16
+
17
+ # Create environment file
18
+ cat > .env.local << EOF
19
+ NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_your_key_here
20
+ CLERK_SECRET_KEY=sk_test_your_secret_key_here
21
+ NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
22
+ NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
23
+ NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
24
+ NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/dashboard
25
+ EOF
26
+ ```
27
+
28
+ Root layout with ClerkProvider:
29
+
30
+ ```tsx
31
+ // app/layout.tsx
32
+ import type { Metadata } from "next";
33
+ import { ClerkProvider } from "@clerk/nextjs";
34
+ import "./globals.css";
35
+
36
+ export const metadata: Metadata = {
37
+ title: "My App",
38
+ description: "Application with Clerk authentication",
39
+ };
40
+
41
+ export default function RootLayout({
42
+ children,
43
+ }: Readonly<{
44
+ children: React.ReactNode;
45
+ }>) {
46
+ return (
47
+ <ClerkProvider>
48
+ <html lang="en">
49
+ <body>{children}</body>
50
+ </html>
51
+ </ClerkProvider>
52
+ );
53
+ }
54
+ ```
55
+
56
+ ---
57
+
58
+ ## 2. Authentication Flow
59
+
60
+ ### Sign-Up Page with Pre-built Component
61
+
62
+ ```tsx
63
+ // app/sign-up/[[...sign-up]]/page.tsx
64
+ import { SignUp } from "@clerk/nextjs";
65
+
66
+ export default function SignUpPage() {
67
+ return (
68
+ <div className="flex min-h-screen items-center justify-center bg-gray-50">
69
+ <div className="w-full max-w-md">
70
+ <SignUp
71
+ appearance={{
72
+ elements: {
73
+ rootBox: "mx-auto",
74
+ card: "shadow-lg",
75
+ },
76
+ }}
77
+ />
78
+ </div>
79
+ </div>
80
+ );
81
+ }
82
+ ```
83
+
84
+ ### Sign-In Page with Pre-built Component
85
+
86
+ ```tsx
87
+ // app/sign-in/[[...sign-in]]/page.tsx
88
+ import { SignIn } from "@clerk/nextjs";
89
+
90
+ export default function SignInPage() {
91
+ return (
92
+ <div className="flex min-h-screen items-center justify-center bg-gray-50">
93
+ <div className="w-full max-w-md">
94
+ <SignIn
95
+ appearance={{
96
+ elements: {
97
+ rootBox: "mx-auto",
98
+ card: "shadow-lg",
99
+ },
100
+ }}
101
+ routing="path"
102
+ path="/sign-in"
103
+ />
104
+ </div>
105
+ </div>
106
+ );
107
+ }
108
+ ```
109
+
110
+ ### Navigation Header with Auth Controls
111
+
112
+ ```tsx
113
+ // components/nav-header.tsx
114
+ import {
115
+ SignInButton,
116
+ SignUpButton,
117
+ SignedIn,
118
+ SignedOut,
119
+ UserButton,
120
+ } from "@clerk/nextjs";
121
+ import Link from "next/link";
122
+
123
+ export function NavHeader() {
124
+ return (
125
+ <header className="border-b">
126
+ <div className="container mx-auto flex h-16 items-center justify-between px-4">
127
+ <Link href="/" className="text-xl font-bold">
128
+ My App
129
+ </Link>
130
+
131
+ <nav className="flex items-center gap-4">
132
+ <SignedOut>
133
+ <SignInButton mode="modal">
134
+ <button className="rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700">
135
+ Sign In
136
+ </button>
137
+ </SignInButton>
138
+ <SignUpButton mode="modal">
139
+ <button className="rounded-md border border-gray-300 px-4 py-2 hover:bg-gray-50">
140
+ Sign Up
141
+ </button>
142
+ </SignUpButton>
143
+ </SignedOut>
144
+
145
+ <SignedIn>
146
+ <Link href="/dashboard" className="hover:text-blue-600">
147
+ Dashboard
148
+ </Link>
149
+ <UserButton
150
+ appearance={{
151
+ elements: {
152
+ avatarBox: "w-10 h-10",
153
+ },
154
+ }}
155
+ />
156
+ </SignedIn>
157
+ </nav>
158
+ </div>
159
+ </header>
160
+ );
161
+ }
162
+ ```
163
+
164
+ ### Sign-Out Button with Redirect
165
+
166
+ ```tsx
167
+ // components/sign-out-button.tsx
168
+ "use client";
169
+
170
+ import { useClerk } from "@clerk/nextjs";
171
+ import { useRouter } from "next/navigation";
172
+
173
+ export function SignOutButton() {
174
+ const { signOut } = useClerk();
175
+ const router = useRouter();
176
+
177
+ const handleSignOut = async () => {
178
+ await signOut();
179
+ router.push("/");
180
+ };
181
+
182
+ return (
183
+ <button
184
+ onClick={handleSignOut}
185
+ className="rounded-md bg-red-600 px-4 py-2 text-white hover:bg-red-700"
186
+ >
187
+ Sign Out
188
+ </button>
189
+ );
190
+ }
191
+ ```
192
+
193
+ ---
194
+
195
+ ## 3. WebAuthn and Passkeys
196
+
197
+ ### Enable WebAuthn in Clerk Dashboard
198
+
199
+ Enable passkeys in Clerk Dashboard:
200
+
201
+ 1. Navigate to User & Authentication → Email, Phone, Username
202
+ 2. Enable "Passkeys" authentication method
203
+ 3. Configure passkey settings
204
+
205
+ ### Client Component with Passkey Support
206
+
207
+ ```tsx
208
+ // components/passkey-setup.tsx
209
+ "use client";
210
+
211
+ import { useUser } from "@clerk/nextjs";
212
+ import { useState } from "react";
213
+
214
+ export function PasskeySetup() {
215
+ const { user } = useUser();
216
+ const [isCreating, setIsCreating] = useState(false);
217
+ const [error, setError] = useState<string | null>(null);
218
+
219
+ const createPasskey = async () => {
220
+ if (!user) return;
221
+
222
+ setIsCreating(true);
223
+ setError(null);
224
+
225
+ try {
226
+ await user.createPasskey();
227
+ alert("Passkey created successfully!");
228
+ } catch (err) {
229
+ setError(err instanceof Error ? err.message : "Failed to create passkey");
230
+ } finally {
231
+ setIsCreating(false);
232
+ }
233
+ };
234
+
235
+ const passkeys = user?.passkeys || [];
236
+
237
+ return (
238
+ <div className="rounded-lg border p-6">
239
+ <h2 className="mb-4 text-xl font-semibold">Passkeys</h2>
240
+
241
+ {passkeys.length > 0 ? (
242
+ <div className="mb-4 space-y-2">
243
+ {passkeys.map((passkey) => (
244
+ <div
245
+ key={passkey.id}
246
+ className="flex items-center justify-between rounded border p-3"
247
+ >
248
+ <div>
249
+ <p className="font-medium">
250
+ {passkey.name || "Unnamed Passkey"}
251
+ </p>
252
+ <p className="text-sm text-gray-600">
253
+ Created: {new Date(passkey.createdAt).toLocaleDateString()}
254
+ </p>
255
+ </div>
256
+ </div>
257
+ ))}
258
+ </div>
259
+ ) : (
260
+ <p className="mb-4 text-gray-600">No passkeys configured</p>
261
+ )}
262
+
263
+ {error && (
264
+ <div className="mb-4 rounded bg-red-50 p-3 text-red-700">{error}</div>
265
+ )}
266
+
267
+ <button
268
+ onClick={createPasskey}
269
+ disabled={isCreating}
270
+ className="rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 disabled:bg-gray-400"
271
+ >
272
+ {isCreating ? "Creating..." : "Add Passkey"}
273
+ </button>
274
+ </div>
275
+ );
276
+ }
277
+ ```
278
+
279
+ ### Sign In with Passkey Flow
280
+
281
+ ```tsx
282
+ // components/passkey-signin.tsx
283
+ "use client";
284
+
285
+ import { useSignIn } from "@clerk/nextjs";
286
+ import { useState } from "react";
287
+ import { useRouter } from "next/navigation";
288
+
289
+ export function PasskeySignIn() {
290
+ const { signIn, setActive } = useSignIn();
291
+ const [isLoading, setIsLoading] = useState(false);
292
+ const router = useRouter();
293
+
294
+ const handlePasskeySignIn = async () => {
295
+ if (!signIn) return;
296
+
297
+ setIsLoading(true);
298
+
299
+ try {
300
+ const signInAttempt = await signIn.authenticateWithPasskey();
301
+
302
+ if (signInAttempt.status === "complete") {
303
+ await setActive({ session: signInAttempt.createdSessionId });
304
+ router.push("/dashboard");
305
+ }
306
+ } catch (err) {
307
+ console.error("Passkey authentication failed:", err);
308
+ } finally {
309
+ setIsLoading(false);
310
+ }
311
+ };
312
+
313
+ return (
314
+ <button
315
+ onClick={handlePasskeySignIn}
316
+ disabled={isLoading}
317
+ className="w-full rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 disabled:bg-gray-400"
318
+ >
319
+ {isLoading ? "Authenticating..." : "Sign In with Passkey"}
320
+ </button>
321
+ );
322
+ }
323
+ ```
324
+
325
+ ---
326
+
327
+ ## 4. Session Management
328
+
329
+ ### Client-Side Session Access
330
+
331
+ ```tsx
332
+ // components/session-info.tsx
333
+ "use client";
334
+
335
+ import { useAuth, useSession } from "@clerk/nextjs";
336
+
337
+ export function SessionInfo() {
338
+ const { userId, sessionId, isLoaded, isSignedIn } = useAuth();
339
+ const { session } = useSession();
340
+
341
+ if (!isLoaded) {
342
+ return <div>Loading session...</div>;
343
+ }
344
+
345
+ if (!isSignedIn) {
346
+ return <div>No active session</div>;
347
+ }
348
+
349
+ return (
350
+ <div className="rounded-lg border p-6">
351
+ <h2 className="mb-4 text-xl font-semibold">Session Information</h2>
352
+
353
+ <dl className="space-y-2">
354
+ <div>
355
+ <dt className="font-medium">User ID:</dt>
356
+ <dd className="font-mono text-sm text-gray-600">{userId}</dd>
357
+ </div>
358
+
359
+ <div>
360
+ <dt className="font-medium">Session ID:</dt>
361
+ <dd className="font-mono text-sm text-gray-600">{sessionId}</dd>
362
+ </div>
363
+
364
+ <div>
365
+ <dt className="font-medium">Last Active:</dt>
366
+ <dd className="text-sm text-gray-600">
367
+ {session?.lastActiveAt
368
+ ? new Date(session.lastActiveAt).toLocaleString()
369
+ : "N/A"}
370
+ </dd>
371
+ </div>
372
+
373
+ <div>
374
+ <dt className="font-medium">Expires At:</dt>
375
+ <dd className="text-sm text-gray-600">
376
+ {session?.expireAt
377
+ ? new Date(session.expireAt).toLocaleString()
378
+ : "N/A"}
379
+ </dd>
380
+ </div>
381
+ </dl>
382
+ </div>
383
+ );
384
+ }
385
+ ```
386
+
387
+ ### Server-Side Session Access
388
+
389
+ ```tsx
390
+ // app/dashboard/session/page.tsx
391
+ import { auth, clerkClient } from "@clerk/nextjs/server";
392
+ import { redirect } from "next/navigation";
393
+
394
+ export default async function SessionPage() {
395
+ const { userId, sessionId } = await auth();
396
+
397
+ if (!userId || !sessionId) {
398
+ redirect("/sign-in");
399
+ }
400
+
401
+ const session = await clerkClient().sessions.getSession(sessionId);
402
+
403
+ return (
404
+ <div className="container mx-auto max-w-2xl py-8">
405
+ <h1 className="mb-6 text-3xl font-bold">Session Details</h1>
406
+
407
+ <div className="rounded-lg border p-6">
408
+ <h2 className="mb-4 text-xl font-semibold">Server-Side Session Data</h2>
409
+
410
+ <dl className="space-y-3">
411
+ <div>
412
+ <dt className="font-medium">Session ID:</dt>
413
+ <dd className="font-mono text-sm text-gray-600">{session.id}</dd>
414
+ </div>
415
+
416
+ <div>
417
+ <dt className="font-medium">User ID:</dt>
418
+ <dd className="font-mono text-sm text-gray-600">
419
+ {session.userId}
420
+ </dd>
421
+ </div>
422
+
423
+ <div>
424
+ <dt className="font-medium">Status:</dt>
425
+ <dd className="text-sm">
426
+ <span
427
+ className={`rounded px-2 py-1 ${
428
+ session.status === "active"
429
+ ? "bg-green-100 text-green-800"
430
+ : "bg-gray-100 text-gray-800"
431
+ }`}
432
+ >
433
+ {session.status}
434
+ </span>
435
+ </dd>
436
+ </div>
437
+
438
+ <div>
439
+ <dt className="font-medium">Created:</dt>
440
+ <dd className="text-sm text-gray-600">
441
+ {new Date(session.createdAt).toLocaleString()}
442
+ </dd>
443
+ </div>
444
+
445
+ <div>
446
+ <dt className="font-medium">Last Active:</dt>
447
+ <dd className="text-sm text-gray-600">
448
+ {new Date(session.lastActiveAt).toLocaleString()}
449
+ </dd>
450
+ </div>
451
+ </dl>
452
+ </div>
453
+ </div>
454
+ );
455
+ }
456
+ ```
457
+
458
+ ---
459
+
460
+ ## 5. Protected Routes
461
+
462
+ ### Middleware with Route Matching
463
+
464
+ ```typescript
465
+ // middleware.ts
466
+ import { clerkMiddleware, createRouteMatcher } from "@clerk/nextjs/server";
467
+
468
+ // Define public routes (no authentication required)
469
+ const isPublicRoute = createRouteMatcher([
470
+ "/",
471
+ "/sign-in(.*)",
472
+ "/sign-up(.*)",
473
+ "/about",
474
+ "/api/public(.*)",
475
+ ]);
476
+
477
+ // Define admin routes (require specific role)
478
+ const isAdminRoute = createRouteMatcher(["/admin(.*)"]);
479
+
480
+ export default clerkMiddleware(async (auth, req) => {
481
+ // Allow public routes
482
+ if (isPublicRoute(req)) {
483
+ return;
484
+ }
485
+
486
+ // Protect admin routes with role check
487
+ if (isAdminRoute(req)) {
488
+ await auth.protect((has) => {
489
+ return has({ role: "admin" });
490
+ });
491
+ return;
492
+ }
493
+
494
+ // Protect all other routes
495
+ await auth.protect();
496
+ });
497
+
498
+ export const config = {
499
+ matcher: [
500
+ // Skip Next.js internals and static files
501
+ "/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)",
502
+ // Always run for API routes
503
+ "/(api|trpc)(.*)",
504
+ ],
505
+ };
506
+ ```
507
+
508
+ ### Server Component Route Protection
509
+
510
+ ```tsx
511
+ // app/dashboard/page.tsx
512
+ import { auth, currentUser } from "@clerk/nextjs/server";
513
+ import { redirect } from "next/navigation";
514
+
515
+ export default async function DashboardPage() {
516
+ const { userId } = await auth();
517
+
518
+ if (!userId) {
519
+ redirect("/sign-in");
520
+ }
521
+
522
+ const user = await currentUser();
523
+
524
+ return (
525
+ <div className="container mx-auto py-8">
526
+ <h1 className="mb-6 text-3xl font-bold">
527
+ Welcome, {user?.firstName || "User"}!
528
+ </h1>
529
+
530
+ <div className="grid gap-6 md:grid-cols-2">
531
+ <div className="rounded-lg border p-6">
532
+ <h2 className="mb-2 text-xl font-semibold">Profile</h2>
533
+ <p className="text-gray-600">Manage your account settings</p>
534
+ </div>
535
+
536
+ <div className="rounded-lg border p-6">
537
+ <h2 className="mb-2 text-xl font-semibold">Activity</h2>
538
+ <p className="text-gray-600">View your recent activity</p>
539
+ </div>
540
+ </div>
541
+ </div>
542
+ );
543
+ }
544
+ ```
545
+
546
+ ### API Route Protection
547
+
548
+ ```typescript
549
+ // app/api/protected/route.ts
550
+ import { auth } from "@clerk/nextjs/server";
551
+ import { NextResponse } from "next/server";
552
+
553
+ export async function GET() {
554
+ const { userId } = await auth();
555
+
556
+ if (!userId) {
557
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
558
+ }
559
+
560
+ // Fetch user-specific data
561
+ const data = {
562
+ userId,
563
+ message: "This is protected data",
564
+ timestamp: new Date().toISOString(),
565
+ };
566
+
567
+ return NextResponse.json(data);
568
+ }
569
+
570
+ export async function POST(req: Request) {
571
+ const { userId, sessionClaims } = await auth();
572
+
573
+ if (!userId) {
574
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
575
+ }
576
+
577
+ const body = await req.json();
578
+
579
+ // Process authenticated request
580
+ return NextResponse.json({
581
+ success: true,
582
+ userId,
583
+ data: body,
584
+ });
585
+ }
586
+ ```
587
+
588
+ ---
589
+
590
+ ## 6. User Profile Management
591
+
592
+ ### User Profile Display Component
593
+
594
+ ```tsx
595
+ // components/user-profile-display.tsx
596
+ "use client";
597
+
598
+ import { useUser } from "@clerk/nextjs";
599
+ import Image from "next/image";
600
+
601
+ export function UserProfileDisplay() {
602
+ const { isLoaded, isSignedIn, user } = useUser();
603
+
604
+ if (!isLoaded) {
605
+ return <div>Loading profile...</div>;
606
+ }
607
+
608
+ if (!isSignedIn || !user) {
609
+ return <div>Please sign in to view your profile</div>;
610
+ }
611
+
612
+ return (
613
+ <div className="rounded-lg border p-6">
614
+ <div className="mb-4 flex items-center gap-4">
615
+ {user.imageUrl && (
616
+ <Image
617
+ src={user.imageUrl}
618
+ alt={`${user.firstName || "User"} profile`}
619
+ width={80}
620
+ height={80}
621
+ className="rounded-full"
622
+ />
623
+ )}
624
+
625
+ <div>
626
+ <h2 className="text-2xl font-bold">
627
+ {user.firstName} {user.lastName}
628
+ </h2>
629
+ {user.username && <p className="text-gray-600">@{user.username}</p>}
630
+ </div>
631
+ </div>
632
+
633
+ <dl className="space-y-2">
634
+ <div>
635
+ <dt className="font-medium">Email:</dt>
636
+ <dd className="text-gray-600">
637
+ {user.primaryEmailAddress?.emailAddress}
638
+ </dd>
639
+ </div>
640
+
641
+ {user.primaryPhoneNumber && (
642
+ <div>
643
+ <dt className="font-medium">Phone:</dt>
644
+ <dd className="text-gray-600">
645
+ {user.primaryPhoneNumber.phoneNumber}
646
+ </dd>
647
+ </div>
648
+ )}
649
+
650
+ <div>
651
+ <dt className="font-medium">Member Since:</dt>
652
+ <dd className="text-gray-600">
653
+ {new Date(user.createdAt).toLocaleDateString()}
654
+ </dd>
655
+ </div>
656
+ </dl>
657
+ </div>
658
+ );
659
+ }
660
+ ```
661
+
662
+ ### Update User Profile
663
+
664
+ ```tsx
665
+ // components/update-profile-form.tsx
666
+ "use client";
667
+
668
+ import { useUser } from "@clerk/nextjs";
669
+ import { useState } from "react";
670
+
671
+ export function UpdateProfileForm() {
672
+ const { user } = useUser();
673
+ const [firstName, setFirstName] = useState(user?.firstName || "");
674
+ const [lastName, setLastName] = useState(user?.lastName || "");
675
+ const [isUpdating, setIsUpdating] = useState(false);
676
+ const [message, setMessage] = useState<{
677
+ type: "success" | "error";
678
+ text: string;
679
+ } | null>(null);
680
+
681
+ const handleSubmit = async (e: React.FormEvent) => {
682
+ e.preventDefault();
683
+
684
+ if (!user) return;
685
+
686
+ setIsUpdating(true);
687
+ setMessage(null);
688
+
689
+ try {
690
+ await user.update({
691
+ firstName,
692
+ lastName,
693
+ });
694
+
695
+ setMessage({ type: "success", text: "Profile updated successfully!" });
696
+ } catch (err) {
697
+ setMessage({
698
+ type: "error",
699
+ text: err instanceof Error ? err.message : "Failed to update profile",
700
+ });
701
+ } finally {
702
+ setIsUpdating(false);
703
+ }
704
+ };
705
+
706
+ return (
707
+ <form onSubmit={handleSubmit} className="space-y-4">
708
+ <div>
709
+ <label htmlFor="firstName" className="block text-sm font-medium">
710
+ First Name
711
+ </label>
712
+ <input
713
+ id="firstName"
714
+ type="text"
715
+ value={firstName}
716
+ onChange={(e) => setFirstName(e.target.value)}
717
+ className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2"
718
+ required
719
+ />
720
+ </div>
721
+
722
+ <div>
723
+ <label htmlFor="lastName" className="block text-sm font-medium">
724
+ Last Name
725
+ </label>
726
+ <input
727
+ id="lastName"
728
+ type="text"
729
+ value={lastName}
730
+ onChange={(e) => setLastName(e.target.value)}
731
+ className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2"
732
+ required
733
+ />
734
+ </div>
735
+
736
+ {message && (
737
+ <div
738
+ className={`rounded p-3 ${
739
+ message.type === "success"
740
+ ? "bg-green-50 text-green-700"
741
+ : "bg-red-50 text-red-700"
742
+ }`}
743
+ >
744
+ {message.text}
745
+ </div>
746
+ )}
747
+
748
+ <button
749
+ type="submit"
750
+ disabled={isUpdating}
751
+ className="w-full rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 disabled:bg-gray-400"
752
+ >
753
+ {isUpdating ? "Updating..." : "Update Profile"}
754
+ </button>
755
+ </form>
756
+ );
757
+ }
758
+ ```
759
+
760
+ ### Upload Profile Image
761
+
762
+ ```tsx
763
+ // components/profile-image-upload.tsx
764
+ "use client";
765
+
766
+ import { useUser } from "@clerk/nextjs";
767
+ import { useState } from "react";
768
+ import Image from "next/image";
769
+
770
+ export function ProfileImageUpload() {
771
+ const { user } = useUser();
772
+ const [isUploading, setIsUploading] = useState(false);
773
+ const [error, setError] = useState<string | null>(null);
774
+
775
+ const handleImageUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {
776
+ const file = e.target.files?.[0];
777
+ if (!file || !user) return;
778
+
779
+ setIsUploading(true);
780
+ setError(null);
781
+
782
+ try {
783
+ await user.setProfileImage({ file });
784
+ } catch (err) {
785
+ setError(err instanceof Error ? err.message : "Failed to upload image");
786
+ } finally {
787
+ setIsUploading(false);
788
+ }
789
+ };
790
+
791
+ if (!user) return null;
792
+
793
+ return (
794
+ <div className="flex items-center gap-4">
795
+ {user.imageUrl && (
796
+ <Image
797
+ src={user.imageUrl}
798
+ alt="Profile"
799
+ width={100}
800
+ height={100}
801
+ className="rounded-full"
802
+ />
803
+ )}
804
+
805
+ <div>
806
+ <label
807
+ htmlFor="profile-image"
808
+ className="cursor-pointer rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700"
809
+ >
810
+ {isUploading ? "Uploading..." : "Upload Image"}
811
+ </label>
812
+ <input
813
+ id="profile-image"
814
+ type="file"
815
+ accept="image/*"
816
+ onChange={handleImageUpload}
817
+ disabled={isUploading}
818
+ className="hidden"
819
+ />
820
+
821
+ {error && <p className="mt-2 text-sm text-red-600">{error}</p>}
822
+ </div>
823
+ </div>
824
+ );
825
+ }
826
+ ```
827
+
828
+ ---
829
+
830
+ ## 7. Organizations
831
+
832
+ ### Organization Switcher Component
833
+
834
+ ```tsx
835
+ // app/dashboard/layout.tsx
836
+ import { OrganizationSwitcher } from "@clerk/nextjs";
837
+
838
+ export default function DashboardLayout({
839
+ children,
840
+ }: {
841
+ children: React.ReactNode;
842
+ }) {
843
+ return (
844
+ <div>
845
+ <nav className="border-b">
846
+ <div className="container mx-auto flex h-16 items-center justify-between px-4">
847
+ <h1 className="text-xl font-bold">Dashboard</h1>
848
+
849
+ <OrganizationSwitcher
850
+ appearance={{
851
+ elements: {
852
+ rootBox: "flex items-center",
853
+ organizationSwitcherTrigger: "rounded-md border px-3 py-2",
854
+ },
855
+ }}
856
+ hidePersonal={false}
857
+ afterCreateOrganizationUrl="/dashboard/organization"
858
+ afterSelectOrganizationUrl="/dashboard/organization"
859
+ />
860
+ </div>
861
+ </nav>
862
+
863
+ <main className="container mx-auto py-8 px-4">{children}</main>
864
+ </div>
865
+ );
866
+ }
867
+ ```
868
+
869
+ ### Custom Organization List
870
+
871
+ ```tsx
872
+ // components/organization-list.tsx
873
+ "use client";
874
+
875
+ import { useOrganizationList } from "@clerk/nextjs";
876
+ import Image from "next/image";
877
+
878
+ export function OrganizationList() {
879
+ const { isLoaded, setActive, userMemberships } = useOrganizationList({
880
+ userMemberships: {
881
+ infinite: true,
882
+ },
883
+ });
884
+
885
+ if (!isLoaded) {
886
+ return <div>Loading organizations...</div>;
887
+ }
888
+
889
+ return (
890
+ <div className="space-y-4">
891
+ <h2 className="text-xl font-semibold">Your Organizations</h2>
892
+
893
+ {userMemberships.data && userMemberships.data.length > 0 ? (
894
+ <ul className="space-y-2">
895
+ {userMemberships.data.map((membership) => (
896
+ <li
897
+ key={membership.id}
898
+ className="flex items-center justify-between rounded-lg border p-4"
899
+ >
900
+ <div className="flex items-center gap-3">
901
+ {membership.organization.imageUrl && (
902
+ <Image
903
+ src={membership.organization.imageUrl}
904
+ alt={membership.organization.name}
905
+ width={40}
906
+ height={40}
907
+ className="rounded"
908
+ />
909
+ )}
910
+
911
+ <div>
912
+ <p className="font-medium">{membership.organization.name}</p>
913
+ <p className="text-sm text-gray-600">
914
+ Role: {membership.role}
915
+ </p>
916
+ </div>
917
+ </div>
918
+
919
+ <button
920
+ onClick={() =>
921
+ setActive({ organization: membership.organization.id })
922
+ }
923
+ className="rounded-md bg-blue-600 px-4 py-2 text-sm text-white hover:bg-blue-700"
924
+ >
925
+ Switch
926
+ </button>
927
+ </li>
928
+ ))}
929
+ </ul>
930
+ ) : (
931
+ <p className="text-gray-600">
932
+ You are not a member of any organizations
933
+ </p>
934
+ )}
935
+
936
+ {userMemberships.hasNextPage && (
937
+ <button
938
+ onClick={() => userMemberships.fetchNext()}
939
+ className="w-full rounded-md border px-4 py-2 hover:bg-gray-50"
940
+ >
941
+ Load More
942
+ </button>
943
+ )}
944
+ </div>
945
+ );
946
+ }
947
+ ```
948
+
949
+ ### Organization Members Management
950
+
951
+ ```tsx
952
+ // components/organization-members.tsx
953
+ "use client";
954
+
955
+ import { useOrganization } from "@clerk/nextjs";
956
+ import Image from "next/image";
957
+
958
+ export function OrganizationMembers() {
959
+ const { organization, memberships, isLoaded } = useOrganization({
960
+ memberships: {
961
+ infinite: true,
962
+ },
963
+ });
964
+
965
+ if (!isLoaded) {
966
+ return <div>Loading members...</div>;
967
+ }
968
+
969
+ if (!organization) {
970
+ return <div>No organization selected</div>;
971
+ }
972
+
973
+ return (
974
+ <div className="space-y-4">
975
+ <div className="flex items-center justify-between">
976
+ <h2 className="text-xl font-semibold">{organization.name} Members</h2>
977
+ <span className="text-sm text-gray-600">
978
+ {organization.membersCount} total members
979
+ </span>
980
+ </div>
981
+
982
+ {memberships.data && memberships.data.length > 0 ? (
983
+ <ul className="space-y-2">
984
+ {memberships.data.map((membership) => (
985
+ <li
986
+ key={membership.id}
987
+ className="flex items-center justify-between rounded-lg border p-4"
988
+ >
989
+ <div className="flex items-center gap-3">
990
+ {membership.publicUserData.imageUrl && (
991
+ <Image
992
+ src={membership.publicUserData.imageUrl}
993
+ alt={membership.publicUserData.firstName || "Member"}
994
+ width={40}
995
+ height={40}
996
+ className="rounded-full"
997
+ />
998
+ )}
999
+
1000
+ <div>
1001
+ <p className="font-medium">
1002
+ {membership.publicUserData.firstName}{" "}
1003
+ {membership.publicUserData.lastName}
1004
+ </p>
1005
+ <p className="text-sm text-gray-600">
1006
+ {membership.publicUserData.identifier}
1007
+ </p>
1008
+ </div>
1009
+ </div>
1010
+
1011
+ <span className="rounded bg-blue-100 px-3 py-1 text-sm text-blue-800">
1012
+ {membership.role}
1013
+ </span>
1014
+ </li>
1015
+ ))}
1016
+ </ul>
1017
+ ) : (
1018
+ <p className="text-gray-600">No members found</p>
1019
+ )}
1020
+
1021
+ {memberships.hasNextPage && (
1022
+ <button
1023
+ onClick={() => memberships.fetchNext()}
1024
+ className="w-full rounded-md border px-4 py-2 hover:bg-gray-50"
1025
+ >
1026
+ Load More Members
1027
+ </button>
1028
+ )}
1029
+ </div>
1030
+ );
1031
+ }
1032
+ ```
1033
+
1034
+ ---
1035
+
1036
+ ## 8. Webhooks
1037
+
1038
+ ### Webhook Handler with Svix Verification
1039
+
1040
+ ```bash
1041
+ # Install Svix for webhook verification
1042
+ npm install svix
1043
+ ```
1044
+
1045
+ ```typescript
1046
+ // app/api/webhooks/clerk/route.ts
1047
+ import { Webhook } from "svix";
1048
+ import { headers } from "next/headers";
1049
+ import { WebhookEvent } from "@clerk/nextjs/server";
1050
+
1051
+ export async function POST(req: Request) {
1052
+ // Get webhook secret from environment
1053
+ const WEBHOOK_SECRET = process.env.CLERK_WEBHOOK_SECRET;
1054
+
1055
+ if (!WEBHOOK_SECRET) {
1056
+ throw new Error("CLERK_WEBHOOK_SECRET is not defined");
1057
+ }
1058
+
1059
+ // Get headers
1060
+ const headerPayload = await headers();
1061
+ const svix_id = headerPayload.get("svix-id");
1062
+ const svix_timestamp = headerPayload.get("svix-timestamp");
1063
+ const svix_signature = headerPayload.get("svix-signature");
1064
+
1065
+ if (!svix_id || !svix_timestamp || !svix_signature) {
1066
+ return new Response("Missing svix headers", { status: 400 });
1067
+ }
1068
+
1069
+ // Get body
1070
+ const payload = await req.json();
1071
+ const body = JSON.stringify(payload);
1072
+
1073
+ // Create Svix instance
1074
+ const wh = new Webhook(WEBHOOK_SECRET);
1075
+
1076
+ let evt: WebhookEvent;
1077
+
1078
+ // Verify webhook
1079
+ try {
1080
+ evt = wh.verify(body, {
1081
+ "svix-id": svix_id,
1082
+ "svix-timestamp": svix_timestamp,
1083
+ "svix-signature": svix_signature,
1084
+ }) as WebhookEvent;
1085
+ } catch (err) {
1086
+ console.error("Webhook verification failed:", err);
1087
+ return new Response("Invalid signature", { status: 400 });
1088
+ }
1089
+
1090
+ // Handle events
1091
+ const eventType = evt.type;
1092
+
1093
+ switch (eventType) {
1094
+ case "user.created":
1095
+ const { id, email_addresses, first_name, last_name } = evt.data;
1096
+ console.log("User created:", {
1097
+ id,
1098
+ email_addresses,
1099
+ first_name,
1100
+ last_name,
1101
+ });
1102
+ // Add user to database
1103
+ break;
1104
+
1105
+ case "user.updated":
1106
+ console.log("User updated:", evt.data.id);
1107
+ // Update user in database
1108
+ break;
1109
+
1110
+ case "user.deleted":
1111
+ console.log("User deleted:", evt.data.id);
1112
+ // Delete user from database
1113
+ break;
1114
+
1115
+ case "organization.created":
1116
+ console.log("Organization created:", evt.data.id);
1117
+ // Create organization in database
1118
+ break;
1119
+
1120
+ case "organization.updated":
1121
+ console.log("Organization updated:", evt.data.id);
1122
+ // Update organization in database
1123
+ break;
1124
+
1125
+ case "organizationMembership.created":
1126
+ console.log("Organization membership created:", evt.data);
1127
+ // Add organization member to database
1128
+ break;
1129
+
1130
+ default:
1131
+ console.log(`Unhandled event type: ${eventType}`);
1132
+ }
1133
+
1134
+ return new Response("Webhook processed", { status: 200 });
1135
+ }
1136
+ ```
1137
+
1138
+ ### User Sync Service
1139
+
1140
+ ```typescript
1141
+ // lib/user-sync.ts
1142
+ import { clerkClient } from "@clerk/nextjs/server";
1143
+
1144
+ export async function syncUserToDatabase(userId: string) {
1145
+ const user = await clerkClient().users.getUser(userId);
1146
+
1147
+ // Your database sync logic
1148
+ const userData = {
1149
+ id: user.id,
1150
+ email: user.emailAddresses[0]?.emailAddress,
1151
+ firstName: user.firstName,
1152
+ lastName: user.lastName,
1153
+ imageUrl: user.imageUrl,
1154
+ createdAt: new Date(user.createdAt),
1155
+ updatedAt: new Date(user.updatedAt),
1156
+ };
1157
+
1158
+ console.log("Syncing user to database:", userData);
1159
+
1160
+ // Example: await db.users.upsert(userData)
1161
+
1162
+ return userData;
1163
+ }
1164
+
1165
+ export async function deleteUserFromDatabase(userId: string) {
1166
+ console.log("Deleting user from database:", userId);
1167
+
1168
+ // Example: await db.users.delete({ where: { id: userId } })
1169
+ }
1170
+ ```
1171
+
1172
+ ---
1173
+
1174
+ ## 9. Testing
1175
+
1176
+ ### Mock Clerk in Tests
1177
+
1178
+ ```bash
1179
+ # Install testing dependencies
1180
+ npm install -D @clerk/testing vitest @testing-library/react @testing-library/jest-dom
1181
+ ```
1182
+
1183
+ ```tsx
1184
+ // __tests__/components/protected-component.test.tsx
1185
+ import { render, screen } from "@testing-library/react";
1186
+ import { describe, it, expect, vi } from "vitest";
1187
+
1188
+ // Mock Clerk hooks
1189
+ vi.mock("@clerk/nextjs", () => ({
1190
+ useAuth: vi.fn(),
1191
+ useUser: vi.fn(),
1192
+ }));
1193
+
1194
+ import { useAuth, useUser } from "@clerk/nextjs";
1195
+ import { ProtectedComponent } from "@/components/protected-component";
1196
+
1197
+ describe("ProtectedComponent", () => {
1198
+ it("shows loading state when not loaded", () => {
1199
+ vi.mocked(useAuth).mockReturnValue({
1200
+ isLoaded: false,
1201
+ isSignedIn: false,
1202
+ userId: null,
1203
+ sessionId: null,
1204
+ getToken: vi.fn(),
1205
+ } as any);
1206
+
1207
+ render(<ProtectedComponent />);
1208
+ expect(screen.getByText("Loading...")).toBeInTheDocument();
1209
+ });
1210
+
1211
+ it("shows sign-in prompt when not authenticated", () => {
1212
+ vi.mocked(useAuth).mockReturnValue({
1213
+ isLoaded: true,
1214
+ isSignedIn: false,
1215
+ userId: null,
1216
+ sessionId: null,
1217
+ getToken: vi.fn(),
1218
+ } as any);
1219
+
1220
+ render(<ProtectedComponent />);
1221
+ expect(screen.getByText("Please sign in")).toBeInTheDocument();
1222
+ });
1223
+
1224
+ it("shows content when authenticated", () => {
1225
+ vi.mocked(useAuth).mockReturnValue({
1226
+ isLoaded: true,
1227
+ isSignedIn: true,
1228
+ userId: "user_123",
1229
+ sessionId: "sess_456",
1230
+ getToken: vi.fn(),
1231
+ } as any);
1232
+
1233
+ vi.mocked(useUser).mockReturnValue({
1234
+ isLoaded: true,
1235
+ isSignedIn: true,
1236
+ user: {
1237
+ id: "user_123",
1238
+ firstName: "John",
1239
+ lastName: "Doe",
1240
+ emailAddresses: [{ emailAddress: "john@example.com" }],
1241
+ },
1242
+ } as any);
1243
+
1244
+ render(<ProtectedComponent />);
1245
+ expect(screen.getByText("Welcome, John!")).toBeInTheDocument();
1246
+ });
1247
+ });
1248
+ ```
1249
+
1250
+ ### Integration Test Setup
1251
+
1252
+ ```typescript
1253
+ // __tests__/setup.ts
1254
+ import { beforeAll, afterAll, afterEach } from "vitest";
1255
+ import { setupClerkTestingToken } from "@clerk/testing/vitest";
1256
+
1257
+ beforeAll(() => {
1258
+ // Setup Clerk testing environment
1259
+ setupClerkTestingToken();
1260
+ });
1261
+
1262
+ afterEach(() => {
1263
+ // Clear mocks after each test
1264
+ vi.clearAllMocks();
1265
+ });
1266
+
1267
+ afterAll(() => {
1268
+ // Cleanup
1269
+ });
1270
+ ```
1271
+
1272
+ ### E2E Test with Playwright
1273
+
1274
+ ```typescript
1275
+ // e2e/auth.spec.ts
1276
+ import { test, expect } from "@playwright/test";
1277
+
1278
+ test.describe("Authentication Flow", () => {
1279
+ test("should sign in successfully", async ({ page }) => {
1280
+ await page.goto("http://localhost:3000");
1281
+
1282
+ // Click sign-in button
1283
+ await page.click("text=Sign In");
1284
+
1285
+ // Fill in credentials
1286
+ await page.fill('input[name="identifier"]', "test@example.com");
1287
+ await page.click('button[type="submit"]');
1288
+
1289
+ await page.fill('input[name="password"]', "testpassword123");
1290
+ await page.click('button[type="submit"]');
1291
+
1292
+ // Wait for redirect to dashboard
1293
+ await page.waitForURL("**/dashboard");
1294
+
1295
+ // Verify user is signed in
1296
+ await expect(page.locator("text=Welcome")).toBeVisible();
1297
+ });
1298
+
1299
+ test("should sign out successfully", async ({ page }) => {
1300
+ // Assume already signed in
1301
+ await page.goto("http://localhost:3000/dashboard");
1302
+
1303
+ // Click user button and sign out
1304
+ await page.click('[data-testid="user-button"]');
1305
+ await page.click("text=Sign Out");
1306
+
1307
+ // Verify redirect to home
1308
+ await page.waitForURL("http://localhost:3000");
1309
+ await expect(page.locator("text=Sign In")).toBeVisible();
1310
+ });
1311
+ });
1312
+ ```
1313
+
1314
+ ---
1315
+
1316
+ ## 10. Advanced Features
1317
+
1318
+ ### Custom JWT Template with Backend API
1319
+
1320
+ ```typescript
1321
+ // app/api/external/route.ts
1322
+ import { auth } from "@clerk/nextjs/server";
1323
+ import { NextResponse } from "next/server";
1324
+
1325
+ export async function GET() {
1326
+ const { userId, getToken } = await auth();
1327
+
1328
+ if (!userId) {
1329
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
1330
+ }
1331
+
1332
+ // Get token with custom template
1333
+ const token = await getToken({ template: "supabase" });
1334
+
1335
+ // Call external API with token
1336
+ const response = await fetch("https://api.external.com/data", {
1337
+ headers: {
1338
+ Authorization: `Bearer ${token}`,
1339
+ },
1340
+ });
1341
+
1342
+ const data = await response.json();
1343
+ return NextResponse.json(data);
1344
+ }
1345
+ ```
1346
+
1347
+ ### Multi-Factor Authentication Setup
1348
+
1349
+ ```tsx
1350
+ // components/mfa-setup.tsx
1351
+ "use client";
1352
+
1353
+ import { useUser } from "@clerk/nextjs";
1354
+ import { useState } from "react";
1355
+
1356
+ export function MFASetup() {
1357
+ const { user } = useUser();
1358
+ const [isEnabling, setIsEnabling] = useState(false);
1359
+ const [qrCode, setQrCode] = useState<string | null>(null);
1360
+ const [backupCodes, setBackupCodes] = useState<string[]>([]);
1361
+
1362
+ const enableTOTP = async () => {
1363
+ if (!user) return;
1364
+
1365
+ setIsEnabling(true);
1366
+
1367
+ try {
1368
+ const totp = await user.createTOTP();
1369
+ setQrCode(totp.qr_code);
1370
+
1371
+ // Generate backup codes
1372
+ const codes = await user.createBackupCode();
1373
+ setBackupCodes(codes.codes);
1374
+ } catch (err) {
1375
+ console.error("Failed to enable TOTP:", err);
1376
+ } finally {
1377
+ setIsEnabling(false);
1378
+ }
1379
+ };
1380
+
1381
+ return (
1382
+ <div className="rounded-lg border p-6">
1383
+ <h2 className="mb-4 text-xl font-semibold">Two-Factor Authentication</h2>
1384
+
1385
+ {!qrCode ? (
1386
+ <button
1387
+ onClick={enableTOTP}
1388
+ disabled={isEnabling}
1389
+ className="rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700"
1390
+ >
1391
+ {isEnabling ? "Setting up..." : "Enable 2FA"}
1392
+ </button>
1393
+ ) : (
1394
+ <div className="space-y-4">
1395
+ <div>
1396
+ <p className="mb-2">
1397
+ Scan this QR code with your authenticator app:
1398
+ </p>
1399
+ <img src={qrCode} alt="QR Code" className="rounded border" />
1400
+ </div>
1401
+
1402
+ {backupCodes.length > 0 && (
1403
+ <div>
1404
+ <p className="mb-2 font-medium">Backup Codes:</p>
1405
+ <ul className="space-y-1 font-mono text-sm">
1406
+ {backupCodes.map((code, idx) => (
1407
+ <li key={idx} className="rounded bg-gray-100 p-2">
1408
+ {code}
1409
+ </li>
1410
+ ))}
1411
+ </ul>
1412
+ <p className="mt-2 text-sm text-gray-600">
1413
+ Save these codes in a secure location
1414
+ </p>
1415
+ </div>
1416
+ )}
1417
+ </div>
1418
+ )}
1419
+ </div>
1420
+ );
1421
+ }
1422
+ ```
1423
+
1424
+ ---
1425
+
1426
+ **Last Updated**: 2026-01-10