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,1106 @@
1
+ # Ruby Production-Ready Code Examples
2
+
3
+ ## Complete Rails 7.2 Application
4
+
5
+ ### Project Structure
6
+
7
+ ```
8
+ rails_app/
9
+ ├── app/
10
+ │ ├── controllers/
11
+ │ │ ├── application_controller.rb
12
+ │ │ ├── api/
13
+ │ │ │ └── v1/
14
+ │ │ │ ├── base_controller.rb
15
+ │ │ │ └── users_controller.rb
16
+ │ │ └── users_controller.rb
17
+ │ ├── models/
18
+ │ │ ├── application_record.rb
19
+ │ │ ├── concerns/
20
+ │ │ │ ├── sluggable.rb
21
+ │ │ │ └── searchable.rb
22
+ │ │ ├── user.rb
23
+ │ │ └── post.rb
24
+ │ ├── services/
25
+ │ │ └── user_registration_service.rb
26
+ │ ├── repositories/
27
+ │ │ └── user_repository.rb
28
+ │ ├── jobs/
29
+ │ │ └── send_welcome_email_job.rb
30
+ │ ├── mailers/
31
+ │ │ └── user_mailer.rb
32
+ │ └── views/
33
+ │ ├── users/
34
+ │ │ ├── index.html.erb
35
+ │ │ ├── show.html.erb
36
+ │ │ └── _user.html.erb
37
+ │ └── layouts/
38
+ │ └── application.html.erb
39
+ ├── config/
40
+ │ ├── application.rb
41
+ │ ├── database.yml
42
+ │ ├── routes.rb
43
+ │ └── initializers/
44
+ │ └── sidekiq.rb
45
+ ├── db/
46
+ │ └── migrate/
47
+ ├── spec/
48
+ │ ├── spec_helper.rb
49
+ │ ├── rails_helper.rb
50
+ │ ├── factories/
51
+ │ │ └── users.rb
52
+ │ ├── models/
53
+ │ │ └── user_spec.rb
54
+ │ ├── requests/
55
+ │ │ └── users_spec.rb
56
+ │ └── system/
57
+ │ └── users_spec.rb
58
+ ├── Gemfile
59
+ └── Dockerfile
60
+ ```
61
+
62
+ ### Main Application Configuration
63
+
64
+ ```ruby
65
+ # config/application.rb
66
+ require_relative "boot"
67
+
68
+ require "rails/all"
69
+
70
+ Bundler.require(*Rails.groups)
71
+
72
+ module RailsApp
73
+ class Application < Rails::Application
74
+ config.load_defaults 7.2
75
+
76
+ # API-only mode (optional)
77
+ # config.api_only = true
78
+
79
+ # Custom configuration
80
+ config.time_zone = "UTC"
81
+ config.active_record.default_timezone = :utc
82
+ config.i18n.default_locale = :en
83
+
84
+ # Background job configuration
85
+ config.active_job.queue_adapter = :sidekiq
86
+
87
+ # CORS configuration (for API)
88
+ config.middleware.insert_before 0, Rack::Cors do
89
+ allow do
90
+ origins "localhost:3000", "example.com"
91
+ resource "*",
92
+ headers: :any,
93
+ methods: [:get, :post, :put, :patch, :delete, :options, :head]
94
+ end
95
+ end
96
+ end
97
+ end
98
+ ```
99
+
100
+ ### Gemfile Configuration
101
+
102
+ ```ruby
103
+ # Gemfile
104
+ source "https://rubygems.org"
105
+
106
+ ruby "3.3.0"
107
+
108
+ # Core Rails
109
+ gem "rails", "~> 7.2.0"
110
+ gem "pg", "~> 1.5"
111
+ gem "puma", ">= 6.0"
112
+
113
+ # Frontend
114
+ gem "turbo-rails"
115
+ gem "stimulus-rails"
116
+ gem "importmap-rails"
117
+
118
+ # Background Jobs
119
+ gem "sidekiq", "~> 7.0"
120
+ gem "redis", "~> 5.0"
121
+
122
+ # Authentication & Authorization
123
+ gem "devise", "~> 4.9"
124
+ gem "pundit", "~> 2.3"
125
+
126
+ # API
127
+ gem "jbuilder"
128
+ gem "active_model_serializers", "~> 0.10.0"
129
+
130
+ # File Upload
131
+ gem "shrine", "~> 3.5"
132
+
133
+ # Performance
134
+ gem "bootsnap", require: false
135
+
136
+ group :development, :test do
137
+ gem "debug"
138
+ gem "factory_bot_rails"
139
+ gem "faker"
140
+ gem "rspec-rails", "~> 7.0"
141
+ gem "rubocop-rails", require: false
142
+ gem "rubocop-rspec", require: false
143
+ end
144
+
145
+ group :test do
146
+ gem "capybara"
147
+ gem "selenium-webdriver"
148
+ gem "shoulda-matchers", "~> 6.0"
149
+ gem "simplecov", require: false
150
+ gem "database_cleaner-active_record"
151
+ end
152
+
153
+ group :development do
154
+ gem "web-console"
155
+ gem "listen"
156
+ end
157
+ ```
158
+
159
+ ### ActiveRecord Models
160
+
161
+ ```ruby
162
+ # app/models/application_record.rb
163
+ class ApplicationRecord < ActiveRecord::Base
164
+ primary_abstract_class
165
+ end
166
+
167
+ # app/models/concerns/sluggable.rb
168
+ module Sluggable
169
+ extend ActiveSupport::Concern
170
+
171
+ included do
172
+ before_validation :generate_slug, on: :create
173
+ validates :slug, presence: true, uniqueness: true
174
+ end
175
+
176
+ def to_param
177
+ slug
178
+ end
179
+
180
+ private
181
+
182
+ def generate_slug
183
+ return if slug.present?
184
+ return unless respond_to?(:title)
185
+
186
+ base_slug = title.parameterize
187
+ candidate = base_slug
188
+ counter = 1
189
+
190
+ while self.class.exists?(slug: candidate)
191
+ candidate = "#{base_slug}-#{counter}"
192
+ counter += 1
193
+ end
194
+
195
+ self.slug = candidate
196
+ end
197
+ end
198
+
199
+ # app/models/user.rb
200
+ class User < ApplicationRecord
201
+ # Include Devise modules
202
+ devise :database_authenticatable, :registerable,
203
+ :recoverable, :rememberable, :validatable,
204
+ :confirmable, :lockable, :timeoutable, :trackable
205
+
206
+ # Associations
207
+ has_many :posts, dependent: :destroy
208
+ has_one :profile, dependent: :destroy
209
+ has_many :comments, dependent: :destroy
210
+
211
+ # Validations
212
+ validates :email, presence: true, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
213
+ validates :name, presence: true, length: { minimum: 2, maximum: 100 }
214
+ validates :username, uniqueness: true, allow_nil: true,
215
+ format: { with: /\A[a-zA-Z0-9_]+\z/, message: "only allows letters, numbers, and underscores" }
216
+
217
+ # Scopes
218
+ scope :active, -> { where(active: true) }
219
+ scope :inactive, -> { where(active: false) }
220
+ scope :recent, -> { order(created_at: :desc) }
221
+ scope :by_name, ->(name) { where("name ILIKE ?", "%#{sanitize_sql_like(name)}%") }
222
+ scope :verified, -> { where.not(confirmed_at: nil) }
223
+
224
+ # Enums
225
+ enum :role, { user: 0, moderator: 1, admin: 2 }, prefix: true
226
+
227
+ # Callbacks
228
+ before_create :set_default_role
229
+ after_create :send_welcome_email
230
+
231
+ # Class methods
232
+ def self.search(query)
233
+ by_name(query).or(where("email ILIKE ?", "%#{sanitize_sql_like(query)}%"))
234
+ end
235
+
236
+ # Instance methods
237
+ def full_name
238
+ "#{first_name} #{last_name}".strip.presence || name
239
+ end
240
+
241
+ def display_name
242
+ username || full_name
243
+ end
244
+
245
+ def admin?
246
+ role_admin?
247
+ end
248
+
249
+ private
250
+
251
+ def set_default_role
252
+ self.role ||= :user
253
+ end
254
+
255
+ def send_welcome_email
256
+ UserMailer.welcome(self).deliver_later
257
+ end
258
+ end
259
+
260
+ # app/models/post.rb
261
+ class Post < ApplicationRecord
262
+ include Sluggable
263
+
264
+ belongs_to :user
265
+ has_many :comments, dependent: :destroy
266
+ has_many_attached :images
267
+
268
+ validates :title, presence: true, length: { minimum: 5, maximum: 200 }
269
+ validates :content, presence: true, length: { minimum: 10 }
270
+
271
+ scope :published, -> { where(published: true) }
272
+ scope :draft, -> { where(published: false) }
273
+ scope :recent, -> { order(published_at: :desc) }
274
+
275
+ # Virtual attributes
276
+ def reading_time
277
+ words_per_minute = 200
278
+ word_count = content.split.size
279
+ (word_count / words_per_minute.to_f).ceil
280
+ end
281
+
282
+ # State machine pattern
283
+ def publish!
284
+ update!(published: true, published_at: Time.current)
285
+ end
286
+
287
+ def unpublish!
288
+ update!(published: false, published_at: nil)
289
+ end
290
+ end
291
+ ```
292
+
293
+ ### Service Objects
294
+
295
+ ```ruby
296
+ # app/services/user_registration_service.rb
297
+ class UserRegistrationService
298
+ Result = Data.define(:success, :user, :errors) do
299
+ def success? = success
300
+ def failure? = !success
301
+ end
302
+
303
+ def initialize(user_params)
304
+ @user_params = user_params
305
+ end
306
+
307
+ def call
308
+ user = User.new(@user_params)
309
+
310
+ ActiveRecord::Base.transaction do
311
+ user.save!
312
+ create_default_profile(user)
313
+ send_welcome_email(user)
314
+ track_registration(user)
315
+ end
316
+
317
+ Result.new(success: true, user: user, errors: nil)
318
+ rescue ActiveRecord::RecordInvalid => e
319
+ Result.new(success: false, user: nil, errors: e.record.errors)
320
+ rescue StandardError => e
321
+ Rails.logger.error("Registration failed: #{e.message}")
322
+ Result.new(success: false, user: nil, errors: ["Registration failed. Please try again."])
323
+ end
324
+
325
+ private
326
+
327
+ def create_default_profile(user)
328
+ user.create_profile!(
329
+ bio: "New user",
330
+ avatar_url: default_avatar_url
331
+ )
332
+ end
333
+
334
+ def send_welcome_email(user)
335
+ UserMailer.welcome(user).deliver_later
336
+ end
337
+
338
+ def track_registration(user)
339
+ # Analytics tracking
340
+ AnalyticsService.track(
341
+ event: "user_registered",
342
+ user_id: user.id,
343
+ properties: {
344
+ email: user.email,
345
+ created_at: user.created_at
346
+ }
347
+ )
348
+ end
349
+
350
+ def default_avatar_url
351
+ "https://example.com/default-avatar.png"
352
+ end
353
+ end
354
+ ```
355
+
356
+ ### Repository Pattern
357
+
358
+ ```ruby
359
+ # app/repositories/user_repository.rb
360
+ class UserRepository
361
+ def find(id)
362
+ User.find_by(id: id)
363
+ end
364
+
365
+ def find_by_email(email)
366
+ User.find_by(email: email)
367
+ end
368
+
369
+ def all(page: 1, per_page: 20, filters: {})
370
+ scope = User.all
371
+ scope = apply_filters(scope, filters)
372
+ scope.page(page).per(per_page)
373
+ end
374
+
375
+ def create(attributes)
376
+ User.create(attributes)
377
+ end
378
+
379
+ def update(user, attributes)
380
+ user.update(attributes)
381
+ user
382
+ end
383
+
384
+ def delete(user)
385
+ user.destroy
386
+ end
387
+
388
+ def search(query, page: 1, per_page: 20)
389
+ User.search(query).page(page).per(per_page)
390
+ end
391
+
392
+ private
393
+
394
+ def apply_filters(scope, filters)
395
+ scope = scope.active if filters[:active]
396
+ scope = scope.verified if filters[:verified]
397
+ scope = scope.where(role: filters[:role]) if filters[:role]
398
+ scope
399
+ end
400
+ end
401
+ ```
402
+
403
+ ### Rails Controllers
404
+
405
+ ```ruby
406
+ # app/controllers/application_controller.rb
407
+ class ApplicationController < ActionController::Base
408
+ include Pundit::Authorization
409
+
410
+ before_action :configure_permitted_parameters, if: :devise_controller?
411
+
412
+ rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
413
+ rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
414
+
415
+ private
416
+
417
+ def configure_permitted_parameters
418
+ devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :username])
419
+ devise_parameter_sanitizer.permit(:account_update, keys: [:name, :username])
420
+ end
421
+
422
+ def user_not_authorized
423
+ flash[:alert] = "You are not authorized to perform this action."
424
+ redirect_back(fallback_location: root_path)
425
+ end
426
+
427
+ def record_not_found
428
+ render file: "#{Rails.root}/public/404.html", status: :not_found, layout: false
429
+ end
430
+ end
431
+
432
+ # app/controllers/users_controller.rb
433
+ class UsersController < ApplicationController
434
+ before_action :authenticate_user!
435
+ before_action :set_user, only: %i[show edit update destroy]
436
+ before_action :authorize_user, only: %i[edit update destroy]
437
+
438
+ # GET /users
439
+ def index
440
+ @users = User.active.recent.page(params[:page])
441
+ end
442
+
443
+ # GET /users/:id
444
+ def show
445
+ @posts = @user.posts.published.recent.limit(10)
446
+ end
447
+
448
+ # GET /users/new
449
+ def new
450
+ @user = User.new
451
+ end
452
+
453
+ # POST /users
454
+ def create
455
+ result = UserRegistrationService.new(user_params).call
456
+
457
+ respond_to do |format|
458
+ if result.success?
459
+ format.html { redirect_to result.user, notice: "User was successfully created." }
460
+ format.turbo_stream { flash.now[:notice] = "User was successfully created." }
461
+ format.json { render json: result.user, status: :created }
462
+ else
463
+ @user = User.new(user_params)
464
+ @user.errors.merge!(result.errors)
465
+ format.html { render :new, status: :unprocessable_entity }
466
+ format.json { render json: @user.errors, status: :unprocessable_entity }
467
+ end
468
+ end
469
+ end
470
+
471
+ # PATCH/PUT /users/:id
472
+ def update
473
+ respond_to do |format|
474
+ if @user.update(user_params)
475
+ format.html { redirect_to @user, notice: "User was successfully updated." }
476
+ format.turbo_stream
477
+ format.json { render json: @user }
478
+ else
479
+ format.html { render :edit, status: :unprocessable_entity }
480
+ format.json { render json: @user.errors, status: :unprocessable_entity }
481
+ end
482
+ end
483
+ end
484
+
485
+ # DELETE /users/:id
486
+ def destroy
487
+ @user.destroy!
488
+
489
+ respond_to do |format|
490
+ format.html { redirect_to users_path, notice: "User was successfully deleted." }
491
+ format.turbo_stream
492
+ format.json { head :no_content }
493
+ end
494
+ end
495
+
496
+ private
497
+
498
+ def set_user
499
+ @user = User.find(params[:id])
500
+ end
501
+
502
+ def authorize_user
503
+ authorize @user
504
+ end
505
+
506
+ def user_params
507
+ params.require(:user).permit(:name, :email, :username, :password, :password_confirmation)
508
+ end
509
+ end
510
+ ```
511
+
512
+ ### API Controllers
513
+
514
+ ```ruby
515
+ # app/controllers/api/v1/base_controller.rb
516
+ module Api
517
+ module V1
518
+ class BaseController < ActionController::API
519
+ include Pundit::Authorization
520
+
521
+ before_action :authenticate_user!
522
+
523
+ rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
524
+ rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
525
+ rescue_from ActiveRecord::RecordInvalid, with: :record_invalid
526
+
527
+ private
528
+
529
+ def authenticate_user!
530
+ token = request.headers["Authorization"]&.split(" ")&.last
531
+ return render_unauthorized unless token
532
+
533
+ begin
534
+ decoded = JWT.decode(token, Rails.application.secret_key_base, true, { algorithm: "HS256" })
535
+ @current_user = User.find(decoded[0]["user_id"])
536
+ rescue JWT::DecodeError, ActiveRecord::RecordNotFound
537
+ render_unauthorized
538
+ end
539
+ end
540
+
541
+ attr_reader :current_user
542
+
543
+ def render_unauthorized
544
+ render json: { error: "Unauthorized" }, status: :unauthorized
545
+ end
546
+
547
+ def user_not_authorized
548
+ render json: { error: "Forbidden" }, status: :forbidden
549
+ end
550
+
551
+ def record_not_found
552
+ render json: { error: "Not found" }, status: :not_found
553
+ end
554
+
555
+ def record_invalid(exception)
556
+ render json: { errors: exception.record.errors.full_messages }, status: :unprocessable_entity
557
+ end
558
+ end
559
+ end
560
+ end
561
+
562
+ # app/controllers/api/v1/users_controller.rb
563
+ module Api
564
+ module V1
565
+ class UsersController < BaseController
566
+ skip_before_action :authenticate_user!, only: [:create]
567
+
568
+ # GET /api/v1/users
569
+ def index
570
+ @users = User.active.page(params[:page]).per(params[:per_page] || 20)
571
+ render json: @users, each_serializer: UserSerializer
572
+ end
573
+
574
+ # GET /api/v1/users/:id
575
+ def show
576
+ @user = User.find(params[:id])
577
+ render json: @user, serializer: UserDetailSerializer
578
+ end
579
+
580
+ # POST /api/v1/users
581
+ def create
582
+ result = UserRegistrationService.new(user_params).call
583
+
584
+ if result.success?
585
+ render json: result.user, serializer: UserSerializer, status: :created
586
+ else
587
+ render json: { errors: result.errors }, status: :unprocessable_entity
588
+ end
589
+ end
590
+
591
+ # PATCH /api/v1/users/:id
592
+ def update
593
+ @user = User.find(params[:id])
594
+ authorize @user
595
+
596
+ if @user.update(user_params)
597
+ render json: @user, serializer: UserSerializer
598
+ else
599
+ render json: { errors: @user.errors.full_messages }, status: :unprocessable_entity
600
+ end
601
+ end
602
+
603
+ private
604
+
605
+ def user_params
606
+ params.require(:user).permit(:name, :email, :username, :password, :password_confirmation)
607
+ end
608
+ end
609
+ end
610
+ end
611
+ ```
612
+
613
+ ### Hotwire/Turbo Patterns
614
+
615
+ ```erb
616
+ <!-- app/views/users/index.html.erb -->
617
+ <div class="users-container">
618
+ <h1>Users</h1>
619
+
620
+ <%= turbo_frame_tag "users" do %>
621
+ <div class="users-list">
622
+ <%= render @users %>
623
+ </div>
624
+
625
+ <%= turbo_frame_tag "pagination" do %>
626
+ <%= paginate @users %>
627
+ <% end %>
628
+ <% end %>
629
+ </div>
630
+
631
+ <!-- app/views/users/_user.html.erb -->
632
+ <%= turbo_frame_tag dom_id(user) do %>
633
+ <article class="user-card">
634
+ <h2><%= link_to user.name, user %></h2>
635
+ <p class="email"><%= user.email %></p>
636
+ <p class="role"><%= user.role %></p>
637
+
638
+ <div class="actions">
639
+ <%= link_to "Edit", edit_user_path(user), data: { turbo_frame: "_top" } %>
640
+ <%= button_to "Delete", user, method: :delete,
641
+ form: { data: { turbo_confirm: "Are you sure?" } },
642
+ class: "btn-danger" %>
643
+ </div>
644
+ </article>
645
+ <% end %>
646
+ ```
647
+
648
+ ```erb
649
+ <!-- app/views/users/create.turbo_stream.erb -->
650
+ <%= turbo_stream.prepend "users", @user %>
651
+ <%= turbo_stream.update "user_form", partial: "users/form", locals: { user: User.new } %>
652
+ <%= turbo_stream.update "flash", partial: "shared/flash" %>
653
+ ```
654
+
655
+ ```javascript
656
+ // app/javascript/controllers/form_controller.js
657
+ import { Controller } from "@hotwired/stimulus";
658
+
659
+ export default class extends Controller {
660
+ static targets = ["input", "submit", "errors"];
661
+
662
+ connect() {
663
+ this.validate();
664
+ }
665
+
666
+ validate() {
667
+ const allValid = this.inputTargets.every((input) => {
668
+ return input.value.trim().length > 0;
669
+ });
670
+
671
+ this.submitTarget.disabled = !allValid;
672
+ }
673
+
674
+ clearErrors() {
675
+ if (this.hasErrorsTarget) {
676
+ this.errorsTarget.innerHTML = "";
677
+ }
678
+ }
679
+ }
680
+ ```
681
+
682
+ ### Background Jobs with Sidekiq
683
+
684
+ ```ruby
685
+ # app/jobs/send_welcome_email_job.rb
686
+ class SendWelcomeEmailJob < ApplicationJob
687
+ queue_as :default
688
+
689
+ retry_on StandardError, wait: :exponentially_longer, attempts: 5
690
+ discard_on ActiveJob::DeserializationError
691
+
692
+ def perform(user_id)
693
+ user = User.find(user_id)
694
+ UserMailer.welcome(user).deliver_now
695
+ rescue ActiveRecord::RecordNotFound => e
696
+ Rails.logger.error("User not found: #{user_id}")
697
+ # Don't retry for non-existent users
698
+ end
699
+ end
700
+
701
+ # app/jobs/data_export_job.rb
702
+ class DataExportJob < ApplicationJob
703
+ queue_as :low_priority
704
+
705
+ def perform(user_id, format: "csv")
706
+ user = User.find(user_id)
707
+ exporter = DataExporter.new(user, format: format)
708
+
709
+ file_path = exporter.export
710
+ UserMailer.export_ready(user, file_path).deliver_now
711
+ ensure
712
+ # Cleanup temporary files
713
+ File.delete(file_path) if file_path && File.exist?(file_path)
714
+ end
715
+ end
716
+
717
+ # config/initializers/sidekiq.rb
718
+ Sidekiq.configure_server do |config|
719
+ config.redis = { url: ENV.fetch("REDIS_URL", "redis://localhost:6379/0") }
720
+ end
721
+
722
+ Sidekiq.configure_client do |config|
723
+ config.redis = { url: ENV.fetch("REDIS_URL", "redis://localhost:6379/0") }
724
+ end
725
+ ```
726
+
727
+ ---
728
+
729
+ ## Complete RSpec Test Suite
730
+
731
+ ```ruby
732
+ # spec/rails_helper.rb
733
+ require "spec_helper"
734
+ require "rspec/rails"
735
+ require "capybara/rspec"
736
+ require "shoulda/matchers"
737
+
738
+ begin
739
+ ActiveRecord::Migration.maintain_test_schema!
740
+ rescue ActiveRecord::PendingMigrationError => e
741
+ abort e.to_s.strip
742
+ end
743
+
744
+ RSpec.configure do |config|
745
+ config.fixture_path = "#{Rails.root}/spec/fixtures"
746
+ config.use_transactional_fixtures = true
747
+ config.infer_spec_type_from_file_location!
748
+ config.filter_rails_from_backtrace!
749
+
750
+ # FactoryBot
751
+ config.include FactoryBot::Syntax::Methods
752
+
753
+ # DatabaseCleaner
754
+ config.before(:suite) do
755
+ DatabaseCleaner.strategy = :transaction
756
+ DatabaseCleaner.clean_with(:truncation)
757
+ end
758
+
759
+ config.around(:each) do |example|
760
+ DatabaseCleaner.cleaning do
761
+ example.run
762
+ end
763
+ end
764
+ end
765
+
766
+ Shoulda::Matchers.configure do |config|
767
+ config.integrate do |with|
768
+ with.test_framework :rspec
769
+ with.library :rails
770
+ end
771
+ end
772
+ ```
773
+
774
+ ```ruby
775
+ # spec/factories/users.rb
776
+ FactoryBot.define do
777
+ factory :user do
778
+ sequence(:email) { |n| "user#{n}@example.com" }
779
+ sequence(:username) { |n| "user#{n}" }
780
+ name { Faker::Name.name }
781
+ password { "password123" }
782
+ confirmed_at { Time.current }
783
+
784
+ trait :unconfirmed do
785
+ confirmed_at { nil }
786
+ end
787
+
788
+ trait :admin do
789
+ role { :admin }
790
+ end
791
+
792
+ trait :with_posts do
793
+ transient do
794
+ posts_count { 3 }
795
+ end
796
+
797
+ after(:create) do |user, evaluator|
798
+ create_list(:post, evaluator.posts_count, user: user)
799
+ end
800
+ end
801
+ end
802
+ end
803
+ ```
804
+
805
+ ```ruby
806
+ # spec/models/user_spec.rb
807
+ RSpec.describe User, type: :model do
808
+ describe "associations" do
809
+ it { is_expected.to have_many(:posts).dependent(:destroy) }
810
+ it { is_expected.to have_one(:profile).dependent(:destroy) }
811
+ it { is_expected.to have_many(:comments).dependent(:destroy) }
812
+ end
813
+
814
+ describe "validations" do
815
+ subject { build(:user) }
816
+
817
+ it { is_expected.to validate_presence_of(:email) }
818
+ it { is_expected.to validate_uniqueness_of(:email).case_insensitive }
819
+ it { is_expected.to validate_presence_of(:name) }
820
+ it { is_expected.to validate_length_of(:name).is_at_least(2).is_at_most(100) }
821
+ end
822
+
823
+ describe "scopes" do
824
+ let!(:active_user) { create(:user, active: true) }
825
+ let!(:inactive_user) { create(:user, active: false) }
826
+
827
+ describe ".active" do
828
+ it "returns only active users" do
829
+ expect(User.active).to include(active_user)
830
+ expect(User.active).not_to include(inactive_user)
831
+ end
832
+ end
833
+
834
+ describe ".recent" do
835
+ it "orders users by created_at desc" do
836
+ expect(User.recent.first).to eq(inactive_user)
837
+ end
838
+ end
839
+ end
840
+
841
+ describe "callbacks" do
842
+ describe "after_create" do
843
+ it "sends welcome email" do
844
+ expect {
845
+ create(:user)
846
+ }.to have_enqueued_job(ActionMailer::MailDeliveryJob)
847
+ end
848
+ end
849
+ end
850
+
851
+ describe "#full_name" do
852
+ context "when first_name and last_name are present" do
853
+ let(:user) { build(:user, first_name: "John", last_name: "Doe") }
854
+
855
+ it "returns the full name" do
856
+ expect(user.full_name).to eq("John Doe")
857
+ end
858
+ end
859
+
860
+ context "when first_name and last_name are blank" do
861
+ let(:user) { build(:user, first_name: nil, last_name: nil, name: "John Doe") }
862
+
863
+ it "returns the name" do
864
+ expect(user.full_name).to eq("John Doe")
865
+ end
866
+ end
867
+ end
868
+
869
+ describe "#admin?" do
870
+ context "when user is admin" do
871
+ let(:user) { build(:user, :admin) }
872
+
873
+ it { expect(user.admin?).to be true }
874
+ end
875
+
876
+ context "when user is not admin" do
877
+ let(:user) { build(:user) }
878
+
879
+ it { expect(user.admin?).to be false }
880
+ end
881
+ end
882
+ end
883
+ ```
884
+
885
+ ```ruby
886
+ # spec/requests/users_spec.rb
887
+ RSpec.describe "Users", type: :request do
888
+ let(:user) { create(:user) }
889
+ let(:valid_attributes) { attributes_for(:user) }
890
+ let(:invalid_attributes) { { email: "" } }
891
+
892
+ describe "GET /users" do
893
+ it "returns success response" do
894
+ get users_path
895
+ expect(response).to have_http_status(:success)
896
+ end
897
+
898
+ it "renders index template" do
899
+ get users_path
900
+ expect(response).to render_template(:index)
901
+ end
902
+ end
903
+
904
+ describe "GET /users/:id" do
905
+ it "returns success response" do
906
+ get user_path(user)
907
+ expect(response).to have_http_status(:success)
908
+ end
909
+
910
+ context "when user does not exist" do
911
+ it "returns 404" do
912
+ expect {
913
+ get user_path(id: "invalid")
914
+ }.to raise_error(ActiveRecord::RecordNotFound)
915
+ end
916
+ end
917
+ end
918
+
919
+ describe "POST /users" do
920
+ context "with valid parameters" do
921
+ it "creates a new user" do
922
+ expect {
923
+ post users_path, params: { user: valid_attributes }
924
+ }.to change(User, :count).by(1)
925
+ end
926
+
927
+ it "redirects to the created user" do
928
+ post users_path, params: { user: valid_attributes }
929
+ expect(response).to redirect_to(User.last)
930
+ end
931
+ end
932
+
933
+ context "with invalid parameters" do
934
+ it "does not create a new user" do
935
+ expect {
936
+ post users_path, params: { user: invalid_attributes }
937
+ }.not_to change(User, :count)
938
+ end
939
+
940
+ it "returns unprocessable entity status" do
941
+ post users_path, params: { user: invalid_attributes }
942
+ expect(response).to have_http_status(:unprocessable_entity)
943
+ end
944
+ end
945
+ end
946
+ end
947
+ ```
948
+
949
+ ```ruby
950
+ # spec/system/users_spec.rb
951
+ RSpec.describe "Users", type: :system do
952
+ before do
953
+ driven_by(:selenium_chrome_headless)
954
+ end
955
+
956
+ describe "User registration" do
957
+ it "allows user to sign up" do
958
+ visit new_user_registration_path
959
+
960
+ fill_in "Name", with: "John Doe"
961
+ fill_in "Email", with: "john@example.com"
962
+ fill_in "Password", with: "password123"
963
+ fill_in "Password confirmation", with: "password123"
964
+
965
+ click_button "Sign up"
966
+
967
+ expect(page).to have_content("Welcome! You have signed up successfully.")
968
+ end
969
+ end
970
+
971
+ describe "User profile" do
972
+ let(:user) { create(:user, :with_posts) }
973
+
974
+ before { sign_in user }
975
+
976
+ it "displays user posts" do
977
+ visit user_path(user)
978
+
979
+ expect(page).to have_content(user.name)
980
+ user.posts.each do |post|
981
+ expect(page).to have_content(post.title)
982
+ end
983
+ end
984
+ end
985
+ end
986
+ ```
987
+
988
+ ---
989
+
990
+ ## Ruby 3.3 Pattern Matching Examples
991
+
992
+ ```ruby
993
+ # Pattern matching with case/in
994
+ def process_api_response(response)
995
+ case response
996
+ in { status: 200, data: data }
997
+ puts "Success: #{data}"
998
+ in { status: 201, data: data, location: location }
999
+ puts "Created at: #{location}"
1000
+ in { status: (400..499), error: error }
1001
+ puts "Client error: #{error}"
1002
+ in { status: (500..599), error: error }
1003
+ puts "Server error: #{error}"
1004
+ else
1005
+ puts "Unknown response: #{response}"
1006
+ end
1007
+ end
1008
+
1009
+ # Array pattern matching
1010
+ def process_coordinates(coords)
1011
+ case coords
1012
+ in [x, y]
1013
+ Point2D.new(x, y)
1014
+ in [x, y, z]
1015
+ Point3D.new(x, y, z)
1016
+ in []
1017
+ raise "Empty coordinates"
1018
+ else
1019
+ raise "Invalid coordinates"
1020
+ end
1021
+ end
1022
+
1023
+ # Hash pattern matching with guards
1024
+ def validate_user_data(user_data)
1025
+ case user_data
1026
+ in { age: age } if age < 0
1027
+ [:error, "Invalid age"]
1028
+ in { age: age } if age < 18
1029
+ [:minor, "User is a minor"]
1030
+ in { age: age, verified: true } if age >= 18
1031
+ [:adult, "Verified adult user"]
1032
+ in { age: age } if age >= 18
1033
+ [:adult, "Unverified adult user"]
1034
+ else
1035
+ [:error, "Invalid user data"]
1036
+ end
1037
+ end
1038
+ ```
1039
+
1040
+ ---
1041
+
1042
+ ## Docker Production Dockerfile
1043
+
1044
+ ```dockerfile
1045
+ # Dockerfile
1046
+ FROM ruby:3.3.0-slim AS builder
1047
+
1048
+ WORKDIR /app
1049
+
1050
+ # Install dependencies
1051
+ RUN apt-get update -qq && \
1052
+ apt-get install -y --no-install-recommends \
1053
+ build-essential \
1054
+ libpq-dev \
1055
+ nodejs \
1056
+ npm && \
1057
+ rm -rf /var/lib/apt/lists/*
1058
+
1059
+ # Install gems
1060
+ COPY Gemfile Gemfile.lock ./
1061
+ RUN bundle config set --local deployment 'true' && \
1062
+ bundle config set --local without 'development test' && \
1063
+ bundle install -j4 --retry 3
1064
+
1065
+ # Production stage
1066
+ FROM ruby:3.3.0-slim AS runtime
1067
+
1068
+ WORKDIR /app
1069
+
1070
+ # Install runtime dependencies
1071
+ RUN apt-get update -qq && \
1072
+ apt-get install -y --no-install-recommends \
1073
+ libpq5 \
1074
+ nodejs && \
1075
+ rm -rf /var/lib/apt/lists/*
1076
+
1077
+ # Create non-root user
1078
+ RUN groupadd -r rails && useradd -r -g rails rails
1079
+
1080
+ # Copy gems from builder
1081
+ COPY --from=builder /usr/local/bundle /usr/local/bundle
1082
+
1083
+ # Copy application
1084
+ COPY --chown=rails:rails . .
1085
+
1086
+ # Precompile assets
1087
+ RUN RAILS_ENV=production SECRET_KEY_BASE=dummy bundle exec rails assets:precompile
1088
+
1089
+ # Switch to non-root user
1090
+ USER rails
1091
+
1092
+ # Expose port
1093
+ EXPOSE 3000
1094
+
1095
+ # Health check
1096
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
1097
+ CMD curl -f http://localhost:3000/health || exit 1
1098
+
1099
+ # Start server
1100
+ CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
1101
+ ```
1102
+
1103
+ ---
1104
+
1105
+ Last Updated: 2026-01-10
1106
+ Version: 1.0.0