moai-adk 0.34.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- moai_adk/__main__.py +136 -5
- moai_adk/astgrep/__init__.py +37 -0
- moai_adk/astgrep/analyzer.py +522 -0
- moai_adk/astgrep/models.py +124 -0
- moai_adk/astgrep/rules.py +179 -0
- moai_adk/cli/commands/analyze.py +11 -2
- moai_adk/cli/commands/doctor.py +7 -1
- moai_adk/cli/commands/init.py +321 -11
- moai_adk/cli/commands/language.py +7 -1
- moai_adk/cli/commands/rank.py +449 -0
- moai_adk/cli/commands/status.py +7 -1
- moai_adk/cli/commands/switch.py +325 -0
- moai_adk/cli/commands/update.py +296 -23
- moai_adk/cli/prompts/init_prompts.py +362 -66
- moai_adk/cli/prompts/translations/__init__.py +573 -0
- moai_adk/cli/ui/prompts.py +61 -2
- moai_adk/cli/worktree/cli.py +106 -1
- moai_adk/cli/worktree/manager.py +155 -0
- moai_adk/core/config/unified.py +244 -63
- moai_adk/core/credentials.py +264 -0
- moai_adk/core/error_recovery_system.py +22 -4
- moai_adk/core/git/conflict_detector.py +10 -1
- moai_adk/core/git/event_detector.py +16 -5
- moai_adk/core/integration/engine.py +2 -2
- moai_adk/core/integration/integration_tester.py +5 -5
- moai_adk/core/language_config_resolver.py +9 -3
- moai_adk/core/merge/analyzer.py +509 -324
- moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
- moai_adk/core/migration/backup_manager.py +54 -4
- moai_adk/core/migration/file_migrator.py +174 -2
- moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
- moai_adk/core/migration/version_detector.py +123 -19
- moai_adk/core/migration/version_migrator.py +44 -9
- moai_adk/core/model_allocator.py +241 -0
- moai_adk/core/project/backup_utils.py +12 -2
- moai_adk/core/project/initializer.py +44 -87
- moai_adk/core/project/phase_executor.py +95 -33
- moai_adk/core/project/validator.py +16 -1
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/rollback_manager.py +60 -25
- moai_adk/core/template/backup.py +88 -6
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +334 -11
- moai_adk/core/template_engine.py +10 -1
- moai_adk/core/template_variable_synchronizer.py +16 -2
- moai_adk/core/version_sync.py +54 -6
- moai_adk/foundation/__init__.py +1 -20
- moai_adk/foundation/testing.py +1 -1
- moai_adk/loop/__init__.py +54 -0
- moai_adk/loop/controller.py +305 -0
- moai_adk/loop/feedback.py +230 -0
- moai_adk/loop/state.py +209 -0
- moai_adk/loop/storage.py +220 -0
- moai_adk/lsp/__init__.py +70 -0
- moai_adk/lsp/client.py +320 -0
- moai_adk/lsp/models.py +261 -0
- moai_adk/lsp/protocol.py +404 -0
- moai_adk/lsp/server_manager.py +248 -0
- moai_adk/project/configuration.py +8 -1
- moai_adk/py.typed +0 -0
- moai_adk/ralph/__init__.py +37 -0
- moai_adk/ralph/engine.py +307 -0
- moai_adk/rank/__init__.py +21 -0
- moai_adk/rank/auth.py +425 -0
- moai_adk/rank/client.py +557 -0
- moai_adk/rank/config.py +147 -0
- moai_adk/rank/hook.py +1503 -0
- moai_adk/rank/py.typed +0 -0
- moai_adk/statusline/__init__.py +3 -0
- moai_adk/statusline/enhanced_output_style_detector.py +5 -5
- moai_adk/statusline/main.py +20 -1
- moai_adk/statusline/memory_collector.py +268 -0
- moai_adk/statusline/renderer.py +54 -38
- moai_adk/tag_system/__init__.py +48 -0
- moai_adk/tag_system/atomic_ops.py +117 -0
- moai_adk/tag_system/linkage.py +335 -0
- moai_adk/tag_system/parser.py +176 -0
- moai_adk/tag_system/validator.py +200 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
- moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
- moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
- moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
- moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
- moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
- moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
- moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
- moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
- moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
- moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
- moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
- moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
- moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
- moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
- moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
- moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
- moai_adk/templates/.claude/commands/moai/fix.md +264 -0
- moai_adk/templates/.claude/commands/moai/loop.md +363 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
- moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
- moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
- moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
- moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
- moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
- moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
- moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
- moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
- moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
- moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
- moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
- moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
- moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
- moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
- moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
- moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
- moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
- moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
- moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
- moai_adk/templates/.claude/settings.json +154 -77
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +226 -320
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +118 -339
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +32 -22
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +96 -316
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +14 -18
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
- moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1136 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +65 -542
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +42 -279
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -0
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1323 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -0
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1087 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1024 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -457
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +75 -283
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +90 -287
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +75 -330
- moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +100 -340
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +113 -326
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +71 -302
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +101 -412
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +96 -327
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +103 -428
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +96 -446
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +225 -423
- moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.git-hooks/pre-push +162 -59
- moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
- moai_adk/templates/.gitignore +65 -107
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +2 -20
- moai_adk/templates/.moai/announcements/en.json +18 -0
- moai_adk/templates/.moai/announcements/ja.json +18 -0
- moai_adk/templates/.moai/announcements/ko.json +18 -0
- moai_adk/templates/.moai/announcements/zh.json +18 -0
- moai_adk/templates/.moai/config/config.yaml +8 -2
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/sections/language.yaml +2 -2
- moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
- moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
- moai_adk/templates/.moai/config/sections/project.yaml +2 -2
- moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
- moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
- moai_adk/templates/.moai/config/sections/system.yaml +46 -1
- moai_adk/templates/.moai/config/sections/user.yaml +1 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
- moai_adk/templates/.moai/llm-configs/glm.json +22 -0
- moai_adk/templates/CLAUDE.ja.md +343 -0
- moai_adk/templates/CLAUDE.ko.md +343 -0
- moai_adk/templates/CLAUDE.md +200 -499
- moai_adk/templates/CLAUDE.zh.md +343 -0
- moai_adk/utils/common.py +37 -0
- moai_adk/version.py +1 -1
- moai_adk-1.1.0.dist-info/METADATA +2443 -0
- moai_adk-1.1.0.dist-info/RECORD +701 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
- moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -0
- moai_adk/core/config/auto_spec_config.py +0 -340
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
- moai_adk/core/spec/confidence_scoring.py +0 -680
- moai_adk/core/spec/ears_template_engine.py +0 -1247
- moai_adk/core/spec/quality_validator.py +0 -687
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +0 -670
- moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -175
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -411
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
- moai_adk/templates/.moai/config/questions/_schema.yaml +0 -151
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
- moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
- moai_adk-0.34.0.dist-info/METADATA +0 -2999
- moai_adk-0.34.0.dist-info/RECORD +0 -463
- moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
- /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
|
@@ -1,99 +1,52 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: moai-lang-ruby
|
|
3
|
-
description: Ruby 3.3+ development specialist covering Rails 7.2, ActiveRecord, Hotwire/Turbo, and modern Ruby patterns. Use when developing Ruby APIs, web applications, or Rails projects.
|
|
4
|
-
version: 1.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
name: "moai-lang-ruby"
|
|
3
|
+
description: "Ruby 3.3+ development specialist covering Rails 7.2, ActiveRecord, Hotwire/Turbo, and modern Ruby patterns. Use when developing Ruby APIs, web applications, or Rails projects."
|
|
4
|
+
version: 1.1.0
|
|
5
|
+
category: "language"
|
|
6
|
+
modularized: true
|
|
7
|
+
user-invocable: false
|
|
8
|
+
tags: ["language", "ruby", "rails", "activerecord", "hotwire", "turbo", "rspec"]
|
|
9
|
+
updated: 2026-01-11
|
|
10
|
+
status: "active"
|
|
11
|
+
allowed-tools:
|
|
12
|
+
- Read
|
|
13
|
+
- Grep
|
|
14
|
+
- Glob
|
|
15
|
+
- Bash
|
|
16
|
+
- mcp__context7__resolve-library-id
|
|
17
|
+
- mcp__context7__get-library-docs
|
|
8
18
|
---
|
|
9
19
|
|
|
10
20
|
## Quick Reference (30 seconds)
|
|
11
21
|
|
|
12
22
|
Ruby 3.3+ Development Specialist - Rails 7.2, ActiveRecord, Hotwire/Turbo, RSpec, and modern Ruby patterns.
|
|
13
23
|
|
|
14
|
-
Auto-Triggers:
|
|
24
|
+
Auto-Triggers: Files with .rb extension, Gemfile, Rakefile, config.ru, Rails or Ruby discussions
|
|
15
25
|
|
|
16
26
|
Core Capabilities:
|
|
27
|
+
|
|
17
28
|
- Ruby 3.3 Features: YJIT production-ready, pattern matching, Data class, endless methods
|
|
18
|
-
- Web Framework: Rails 7.2 with Turbo, Stimulus, ActiveRecord
|
|
19
|
-
- Frontend: Hotwire
|
|
20
|
-
- Testing: RSpec with factories, request specs, system specs
|
|
29
|
+
- Web Framework: Rails 7.2 with Turbo, Stimulus, and ActiveRecord
|
|
30
|
+
- Frontend: Hotwire including Turbo and Stimulus for SPA-like experiences
|
|
31
|
+
- Testing: RSpec with factories, request specs, and system specs
|
|
21
32
|
- Background Jobs: Sidekiq with ActiveJob
|
|
22
33
|
- Package Management: Bundler with Gemfile
|
|
23
34
|
- Code Quality: RuboCop with Rails cops
|
|
24
|
-
- Database: ActiveRecord with migrations, associations, scopes
|
|
35
|
+
- Database: ActiveRecord with migrations, associations, and scopes
|
|
25
36
|
|
|
26
37
|
### Quick Patterns
|
|
27
38
|
|
|
28
|
-
Rails Controller:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
respond_to do |format|
|
|
41
|
-
if @user.save
|
|
42
|
-
format.html { redirect_to @user, notice: "User was successfully created." }
|
|
43
|
-
format.turbo_stream
|
|
44
|
-
else
|
|
45
|
-
format.html { render :new, status: :unprocessable_entity }
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
private
|
|
51
|
-
|
|
52
|
-
def set_user
|
|
53
|
-
@user = User.find(params[:id])
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def user_params
|
|
57
|
-
params.require(:user).permit(:name, :email)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
ActiveRecord Model:
|
|
63
|
-
```ruby
|
|
64
|
-
class User < ApplicationRecord
|
|
65
|
-
has_many :posts, dependent: :destroy
|
|
66
|
-
has_one :profile, dependent: :destroy
|
|
67
|
-
|
|
68
|
-
validates :email, presence: true, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
|
|
69
|
-
validates :name, presence: true, length: { minimum: 2, maximum: 100 }
|
|
70
|
-
|
|
71
|
-
scope :active, -> { where(active: true) }
|
|
72
|
-
scope :recent, -> { order(created_at: :desc) }
|
|
73
|
-
|
|
74
|
-
def full_name
|
|
75
|
-
"#{first_name} #{last_name}".strip
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
RSpec Test:
|
|
81
|
-
```ruby
|
|
82
|
-
RSpec.describe User, type: :model do
|
|
83
|
-
describe "validations" do
|
|
84
|
-
it { is_expected.to validate_presence_of(:email) }
|
|
85
|
-
it { is_expected.to validate_uniqueness_of(:email) }
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
describe "#full_name" do
|
|
89
|
-
let(:user) { build(:user, first_name: "John", last_name: "Doe") }
|
|
90
|
-
|
|
91
|
-
it "returns the full name" do
|
|
92
|
-
expect(user.full_name).to eq("John Doe")
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
```
|
|
39
|
+
Rails Controller Pattern:
|
|
40
|
+
|
|
41
|
+
Create UsersController inheriting from ApplicationController. Add before_action for set_user calling only on show, edit, update, and destroy actions. Define index method assigning User.all to instance variable. Define create method creating new User with user_params. Use respond_to block with format.html redirecting on success or rendering new with unprocessable_entity status, and format.turbo_stream for Turbo responses. Add private set_user method finding by params id. Add user_params method requiring user and permitting name and email.
|
|
42
|
+
|
|
43
|
+
ActiveRecord Model Pattern:
|
|
44
|
+
|
|
45
|
+
Create User model inheriting from ApplicationRecord. Define has_many for posts with dependent destroy and has_one for profile with dependent destroy. Add validates for email with presence, uniqueness, and format using URI::MailTo::EMAIL_REGEXP. Add validates for name with presence and length minimum 2 maximum 100. Define active scope filtering where active is true. Define recent scope ordering by created_at descending. Create full_name method returning first_name and last_name joined with space and stripped.
|
|
46
|
+
|
|
47
|
+
RSpec Test Pattern:
|
|
48
|
+
|
|
49
|
+
Create RSpec.describe for User model type. In describe validations block, add expectations for validate_presence_of and validate_uniqueness_of for email. In describe full_name block, use let to build user with first_name John and last_name Doe. Add it block expecting user.full_name to eq John Doe.
|
|
97
50
|
|
|
98
51
|
---
|
|
99
52
|
|
|
@@ -101,532 +54,96 @@ end
|
|
|
101
54
|
|
|
102
55
|
### Ruby 3.3 New Features
|
|
103
56
|
|
|
104
|
-
YJIT
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
in { status: "ok", data: data }
|
|
116
|
-
puts "Success: #{data}"
|
|
117
|
-
in { status: "error", message: msg }
|
|
118
|
-
puts "Error: #{msg}"
|
|
119
|
-
in { status: status } if %w[pending processing].include?(status)
|
|
120
|
-
puts "In progress..."
|
|
121
|
-
else
|
|
122
|
-
puts "Unknown response"
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# Array pattern matching
|
|
127
|
-
case [1, 2, 3]
|
|
128
|
-
in [first, *rest]
|
|
129
|
-
puts "First: #{first}, Rest: #{rest}"
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# Hash pattern matching with guard
|
|
133
|
-
case { name: "John", age: 25 }
|
|
134
|
-
in { name:, age: } if age >= 18
|
|
135
|
-
puts "Adult: #{name}"
|
|
136
|
-
end
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
Data Class (Immutable Structs):
|
|
140
|
-
```ruby
|
|
141
|
-
# Define immutable data class
|
|
142
|
-
User = Data.define(:name, :email) do
|
|
143
|
-
def greeting
|
|
144
|
-
"Hello, #{name}!"
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
user = User.new(name: "John", email: "john@example.com")
|
|
149
|
-
user.name # => "John"
|
|
150
|
-
user.greeting # => "Hello, John!"
|
|
151
|
-
# user.name = "Jane" # => FrozenError
|
|
152
|
-
|
|
153
|
-
# With default values
|
|
154
|
-
Point = Data.define(:x, :y) do
|
|
155
|
-
def self.origin
|
|
156
|
-
new(x: 0, y: 0)
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
```
|
|
57
|
+
YJIT Production-Ready:
|
|
58
|
+
|
|
59
|
+
YJIT is enabled by default in Ruby 3.3 providing 15 to 20 percent performance improvement for Rails applications. Enable by running ruby with yjit flag or setting RUBY_YJIT_ENABLE environment variable to 1. Check status by calling RubyVM::YJIT.enabled? method.
|
|
60
|
+
|
|
61
|
+
Pattern Matching with case/in:
|
|
62
|
+
|
|
63
|
+
Create process_response method taking response parameter. Use case with response and in for pattern matching. Match status ok with data extracting data variable and puts success message. Match status error with message extracting msg variable. Match status with guard condition checking pending or processing. Use else for unknown response.
|
|
64
|
+
|
|
65
|
+
Data Class for Immutable Structs:
|
|
66
|
+
|
|
67
|
+
Create User using Data.define with name and email symbols. Add block defining greeting method returning hello message with name. Create user instance with keyword arguments. Access name property and call greeting method.
|
|
160
68
|
|
|
161
69
|
Endless Method Definition:
|
|
162
|
-
|
|
163
|
-
class
|
|
164
|
-
# Single expression methods
|
|
165
|
-
def add(a, b) = a + b
|
|
166
|
-
def multiply(a, b) = a * b
|
|
167
|
-
|
|
168
|
-
# With method chaining
|
|
169
|
-
def double(n) = n * 2
|
|
170
|
-
def square(n) = n ** 2
|
|
171
|
-
|
|
172
|
-
# Predicate methods
|
|
173
|
-
def positive?(n) = n > 0
|
|
174
|
-
def even?(n) = n.even?
|
|
175
|
-
end
|
|
176
|
-
```
|
|
70
|
+
|
|
71
|
+
Create Calculator class with add, multiply, and positive? methods using equals sign syntax for single expression methods.
|
|
177
72
|
|
|
178
73
|
### Rails 7.2 Patterns
|
|
179
74
|
|
|
180
|
-
Application Setup:
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
source "https://rubygems.org"
|
|
184
|
-
|
|
185
|
-
gem "rails", "~> 7.2.0"
|
|
186
|
-
gem "pg", "~> 1.5"
|
|
187
|
-
gem "puma", ">= 6.0"
|
|
188
|
-
gem "turbo-rails"
|
|
189
|
-
gem "stimulus-rails"
|
|
190
|
-
gem "jbuilder"
|
|
191
|
-
gem "redis", ">= 5.0"
|
|
192
|
-
gem "sidekiq", "~> 7.0"
|
|
193
|
-
|
|
194
|
-
group :development, :test do
|
|
195
|
-
gem "rspec-rails", "~> 7.0"
|
|
196
|
-
gem "factory_bot_rails"
|
|
197
|
-
gem "faker"
|
|
198
|
-
gem "rubocop-rails", require: false
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
group :test do
|
|
202
|
-
gem "capybara"
|
|
203
|
-
gem "shoulda-matchers"
|
|
204
|
-
end
|
|
205
|
-
```
|
|
75
|
+
Application Setup in Gemfile:
|
|
76
|
+
|
|
77
|
+
Set source to rubygems.org. Add rails version constraint for 7.2, pg for 1.5, puma for 6.0 or later, turbo-rails, stimulus-rails, and sidekiq for 7.0. In development and test group add rspec-rails for 7.0, factory_bot_rails, faker, and rubocop-rails with require false. In test group add capybara and shoulda-matchers.
|
|
206
78
|
|
|
207
79
|
Model with Concerns:
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
class Post < ApplicationRecord
|
|
231
|
-
include Sluggable
|
|
232
|
-
|
|
233
|
-
belongs_to :user
|
|
234
|
-
has_many :comments, dependent: :destroy
|
|
235
|
-
has_many_attached :images
|
|
236
|
-
|
|
237
|
-
validates :title, presence: true, length: { minimum: 5 }
|
|
238
|
-
validates :content, presence: true
|
|
239
|
-
|
|
240
|
-
scope :published, -> { where(published: true) }
|
|
241
|
-
scope :by_user, ->(user) { where(user: user) }
|
|
242
|
-
end
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
Service Objects:
|
|
246
|
-
```ruby
|
|
247
|
-
# app/services/user_registration_service.rb
|
|
248
|
-
class UserRegistrationService
|
|
249
|
-
def initialize(user_params)
|
|
250
|
-
@user_params = user_params
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
def call
|
|
254
|
-
user = User.new(@user_params)
|
|
255
|
-
|
|
256
|
-
ActiveRecord::Base.transaction do
|
|
257
|
-
user.save!
|
|
258
|
-
create_profile(user)
|
|
259
|
-
send_welcome_email(user)
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
Result.new(success: true, user: user)
|
|
263
|
-
rescue ActiveRecord::RecordInvalid => e
|
|
264
|
-
Result.new(success: false, errors: e.record.errors)
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
private
|
|
268
|
-
|
|
269
|
-
def create_profile(user)
|
|
270
|
-
user.create_profile!(bio: "New user")
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
def send_welcome_email(user)
|
|
274
|
-
UserMailer.welcome(user).deliver_later
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
Result = Data.define(:success, :user, :errors) do
|
|
278
|
-
def success? = success
|
|
279
|
-
def failure? = !success
|
|
280
|
-
end
|
|
281
|
-
end
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
### Hotwire (Turbo + Stimulus)
|
|
285
|
-
|
|
286
|
-
Turbo Frames:
|
|
287
|
-
```erb
|
|
288
|
-
<!-- app/views/posts/index.html.erb -->
|
|
289
|
-
<%= turbo_frame_tag "posts" do %>
|
|
290
|
-
<% @posts.each do |post| %>
|
|
291
|
-
<%= render post %>
|
|
292
|
-
<% end %>
|
|
293
|
-
<% end %>
|
|
294
|
-
|
|
295
|
-
<!-- app/views/posts/_post.html.erb -->
|
|
296
|
-
<%= turbo_frame_tag dom_id(post) do %>
|
|
297
|
-
<article class="post">
|
|
298
|
-
<h2><%= link_to post.title, post %></h2>
|
|
299
|
-
<p><%= truncate(post.content, length: 200) %></p>
|
|
300
|
-
<%= link_to "Edit", edit_post_path(post) %>
|
|
301
|
-
</article>
|
|
302
|
-
<% end %>
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
Turbo Streams:
|
|
306
|
-
```ruby
|
|
307
|
-
# app/controllers/posts_controller.rb
|
|
308
|
-
def create
|
|
309
|
-
@post = current_user.posts.build(post_params)
|
|
310
|
-
|
|
311
|
-
respond_to do |format|
|
|
312
|
-
if @post.save
|
|
313
|
-
format.turbo_stream
|
|
314
|
-
format.html { redirect_to @post }
|
|
315
|
-
else
|
|
316
|
-
format.html { render :new, status: :unprocessable_entity }
|
|
317
|
-
end
|
|
318
|
-
end
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
# app/views/posts/create.turbo_stream.erb
|
|
322
|
-
<%= turbo_stream.prepend "posts", @post %>
|
|
323
|
-
<%= turbo_stream.update "new_post", partial: "posts/form", locals: { post: Post.new } %>
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
Stimulus Controller:
|
|
327
|
-
```javascript
|
|
328
|
-
// app/javascript/controllers/form_controller.js
|
|
329
|
-
import { Controller } from "@hotwired/stimulus"
|
|
330
|
-
|
|
331
|
-
export default class extends Controller {
|
|
332
|
-
static targets = ["input", "submit", "output"]
|
|
333
|
-
static values = { url: String }
|
|
334
|
-
|
|
335
|
-
connect() {
|
|
336
|
-
this.validate()
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
validate() {
|
|
340
|
-
const isValid = this.inputTargets.every(input => input.value.length > 0)
|
|
341
|
-
this.submitTarget.disabled = !isValid
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
async submit(event) {
|
|
345
|
-
event.preventDefault()
|
|
346
|
-
|
|
347
|
-
const response = await fetch(this.urlValue, {
|
|
348
|
-
method: "POST",
|
|
349
|
-
body: new FormData(this.element),
|
|
350
|
-
headers: { "Accept": "text/vnd.turbo-stream.html" }
|
|
351
|
-
})
|
|
352
|
-
|
|
353
|
-
if (response.ok) {
|
|
354
|
-
this.element.reset()
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
### RSpec Testing Patterns
|
|
361
|
-
|
|
362
|
-
Model Specs:
|
|
363
|
-
```ruby
|
|
364
|
-
# spec/models/user_spec.rb
|
|
365
|
-
RSpec.describe User, type: :model do
|
|
366
|
-
describe "associations" do
|
|
367
|
-
it { is_expected.to have_many(:posts).dependent(:destroy) }
|
|
368
|
-
it { is_expected.to have_one(:profile).dependent(:destroy) }
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
describe "validations" do
|
|
372
|
-
subject { build(:user) }
|
|
373
|
-
|
|
374
|
-
it { is_expected.to validate_presence_of(:email) }
|
|
375
|
-
it { is_expected.to validate_uniqueness_of(:email).case_insensitive }
|
|
376
|
-
it { is_expected.to validate_length_of(:name).is_at_least(2).is_at_most(100) }
|
|
377
|
-
end
|
|
378
|
-
|
|
379
|
-
describe "scopes" do
|
|
380
|
-
describe ".active" do
|
|
381
|
-
let!(:active_user) { create(:user, active: true) }
|
|
382
|
-
let!(:inactive_user) { create(:user, active: false) }
|
|
383
|
-
|
|
384
|
-
it "returns only active users" do
|
|
385
|
-
expect(described_class.active).to contain_exactly(active_user)
|
|
386
|
-
end
|
|
387
|
-
end
|
|
388
|
-
end
|
|
389
|
-
|
|
390
|
-
describe "#full_name" do
|
|
391
|
-
context "when both names are present" do
|
|
392
|
-
let(:user) { build(:user, first_name: "John", last_name: "Doe") }
|
|
393
|
-
|
|
394
|
-
it "returns the full name" do
|
|
395
|
-
expect(user.full_name).to eq("John Doe")
|
|
396
|
-
end
|
|
397
|
-
end
|
|
398
|
-
|
|
399
|
-
context "when last name is missing" do
|
|
400
|
-
let(:user) { build(:user, first_name: "John", last_name: nil) }
|
|
401
|
-
|
|
402
|
-
it "returns only first name" do
|
|
403
|
-
expect(user.full_name).to eq("John")
|
|
404
|
-
end
|
|
405
|
-
end
|
|
406
|
-
end
|
|
407
|
-
end
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
Request Specs:
|
|
411
|
-
```ruby
|
|
412
|
-
# spec/requests/posts_spec.rb
|
|
413
|
-
RSpec.describe "Posts", type: :request do
|
|
414
|
-
let(:user) { create(:user) }
|
|
415
|
-
|
|
416
|
-
before { sign_in user }
|
|
417
|
-
|
|
418
|
-
describe "GET /posts" do
|
|
419
|
-
let!(:posts) { create_list(:post, 3, user: user) }
|
|
420
|
-
|
|
421
|
-
it "returns a successful response" do
|
|
422
|
-
get posts_path
|
|
423
|
-
expect(response).to have_http_status(:ok)
|
|
424
|
-
end
|
|
425
|
-
|
|
426
|
-
it "displays all posts" do
|
|
427
|
-
get posts_path
|
|
428
|
-
posts.each do |post|
|
|
429
|
-
expect(response.body).to include(post.title)
|
|
430
|
-
end
|
|
431
|
-
end
|
|
432
|
-
end
|
|
433
|
-
|
|
434
|
-
describe "POST /posts" do
|
|
435
|
-
let(:valid_params) { { post: attributes_for(:post) } }
|
|
436
|
-
let(:invalid_params) { { post: { title: "" } } }
|
|
437
|
-
|
|
438
|
-
context "with valid parameters" do
|
|
439
|
-
it "creates a new post" do
|
|
440
|
-
expect {
|
|
441
|
-
post posts_path, params: valid_params
|
|
442
|
-
}.to change(Post, :count).by(1)
|
|
443
|
-
end
|
|
444
|
-
|
|
445
|
-
it "redirects to the created post" do
|
|
446
|
-
post posts_path, params: valid_params
|
|
447
|
-
expect(response).to redirect_to(Post.last)
|
|
448
|
-
end
|
|
449
|
-
end
|
|
450
|
-
|
|
451
|
-
context "with invalid parameters" do
|
|
452
|
-
it "does not create a new post" do
|
|
453
|
-
expect {
|
|
454
|
-
post posts_path, params: invalid_params
|
|
455
|
-
}.not_to change(Post, :count)
|
|
456
|
-
end
|
|
457
|
-
|
|
458
|
-
it "returns unprocessable entity status" do
|
|
459
|
-
post posts_path, params: invalid_params
|
|
460
|
-
expect(response).to have_http_status(:unprocessable_entity)
|
|
461
|
-
end
|
|
462
|
-
end
|
|
463
|
-
end
|
|
464
|
-
end
|
|
465
|
-
```
|
|
80
|
+
|
|
81
|
+
Create Sluggable module extending ActiveSupport::Concern. In included block add before_validation for generate_slug on create and validates for slug with presence and uniqueness. Define to_param returning slug. Add private generate_slug method setting slug from parameterized title if title present and slug blank. Create Post model including Sluggable with belongs_to user, has_many comments with dependent destroy, has_many_attached images. Add validations and published scope.
|
|
82
|
+
|
|
83
|
+
Service Objects Pattern:
|
|
84
|
+
|
|
85
|
+
Create UserRegistrationService with initialize accepting user_params. Define call method creating User, using ActiveRecord::Base.transaction to save user, create profile, and send welcome email. Return Result with success true and user. Rescue RecordInvalid returning Result with success false and errors. Add private methods for create_profile and send_welcome_email. Define Result as Data.define with success, user, and errors, adding success? and failure? predicate methods.
|
|
86
|
+
|
|
87
|
+
### Hotwire Turbo and Stimulus
|
|
88
|
+
|
|
89
|
+
Turbo Frames Pattern:
|
|
90
|
+
|
|
91
|
+
In index view, use turbo_frame_tag with posts id and iterate posts rendering each. In post partial, use turbo_frame_tag with dom_id for post, containing article with h2 link and truncated content paragraph.
|
|
92
|
+
|
|
93
|
+
Turbo Streams Pattern:
|
|
94
|
+
|
|
95
|
+
In controller create action, build post from current_user.posts. Use respond_to with format.turbo_stream and format.html for redirect or render based on save success. In create.turbo_stream.erb view, use turbo_stream.prepend for posts with post, and turbo_stream.update for new_post form partial.
|
|
96
|
+
|
|
97
|
+
Stimulus Controller Pattern:
|
|
98
|
+
|
|
99
|
+
In JavaScript controller file, import Controller from hotwired/stimulus. Export default class extending Controller with static targets array for input and submit. Define connect method calling validate. Define validate method checking all input targets have values and setting submit target disabled accordingly.
|
|
100
|
+
|
|
101
|
+
### RSpec Testing Basics
|
|
466
102
|
|
|
467
103
|
Factory Bot Patterns:
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
FactoryBot.define do
|
|
471
|
-
factory :user do
|
|
472
|
-
sequence(:email) { |n| "user#{n}@example.com" }
|
|
473
|
-
name { Faker::Name.name }
|
|
474
|
-
password { "password123" }
|
|
475
|
-
active { true }
|
|
476
|
-
|
|
477
|
-
trait :inactive do
|
|
478
|
-
active { false }
|
|
479
|
-
end
|
|
480
|
-
|
|
481
|
-
trait :admin do
|
|
482
|
-
role { :admin }
|
|
483
|
-
end
|
|
484
|
-
|
|
485
|
-
trait :with_posts do
|
|
486
|
-
transient do
|
|
487
|
-
posts_count { 3 }
|
|
488
|
-
end
|
|
489
|
-
|
|
490
|
-
after(:create) do |user, evaluator|
|
|
491
|
-
create_list(:post, evaluator.posts_count, user: user)
|
|
492
|
-
end
|
|
493
|
-
end
|
|
494
|
-
|
|
495
|
-
factory :admin_user, traits: [:admin]
|
|
496
|
-
end
|
|
497
|
-
end
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
### Sidekiq Background Jobs
|
|
501
|
-
|
|
502
|
-
Job Definition:
|
|
503
|
-
```ruby
|
|
504
|
-
# app/jobs/process_order_job.rb
|
|
505
|
-
class ProcessOrderJob < ApplicationJob
|
|
506
|
-
queue_as :default
|
|
507
|
-
retry_on ActiveRecord::Deadlocked, wait: 5.seconds, attempts: 3
|
|
508
|
-
discard_on ActiveJob::DeserializationError
|
|
509
|
-
|
|
510
|
-
def perform(order_id)
|
|
511
|
-
order = Order.find(order_id)
|
|
512
|
-
|
|
513
|
-
ActiveRecord::Base.transaction do
|
|
514
|
-
order.process!
|
|
515
|
-
order.update!(processed_at: Time.current)
|
|
516
|
-
OrderMailer.confirmation(order).deliver_later
|
|
517
|
-
end
|
|
518
|
-
end
|
|
519
|
-
end
|
|
520
|
-
|
|
521
|
-
# Sidekiq configuration
|
|
522
|
-
# config/initializers/sidekiq.rb
|
|
523
|
-
Sidekiq.configure_server do |config|
|
|
524
|
-
config.redis = { url: ENV.fetch("REDIS_URL", "redis://localhost:6379/1") }
|
|
525
|
-
end
|
|
526
|
-
|
|
527
|
-
Sidekiq.configure_client do |config|
|
|
528
|
-
config.redis = { url: ENV.fetch("REDIS_URL", "redis://localhost:6379/1") }
|
|
529
|
-
end
|
|
530
|
-
```
|
|
531
|
-
|
|
532
|
-
### ActiveRecord Advanced Patterns
|
|
533
|
-
|
|
534
|
-
Scopes and Query Objects:
|
|
535
|
-
```ruby
|
|
536
|
-
class Post < ApplicationRecord
|
|
537
|
-
scope :published, -> { where(published: true) }
|
|
538
|
-
scope :recent, -> { order(created_at: :desc) }
|
|
539
|
-
scope :by_author, ->(author) { where(author: author) }
|
|
540
|
-
scope :search, ->(query) { where("title ILIKE ?", "%#{query}%") }
|
|
541
|
-
|
|
542
|
-
# Complex scope with joins
|
|
543
|
-
scope :with_comments, -> {
|
|
544
|
-
joins(:comments).group(:id).having("COUNT(comments.id) > 0")
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
# Scope returning specific columns
|
|
548
|
-
scope :titles_only, -> { select(:id, :title) }
|
|
549
|
-
end
|
|
550
|
-
|
|
551
|
-
# Query Object
|
|
552
|
-
class PostSearchQuery
|
|
553
|
-
def initialize(relation = Post.all)
|
|
554
|
-
@relation = relation
|
|
555
|
-
end
|
|
556
|
-
|
|
557
|
-
def call(params)
|
|
558
|
-
@relation
|
|
559
|
-
.then { |r| filter_by_status(r, params[:status]) }
|
|
560
|
-
.then { |r| filter_by_date(r, params[:start_date], params[:end_date]) }
|
|
561
|
-
.then { |r| search_by_title(r, params[:query]) }
|
|
562
|
-
.then { |r| paginate(r, params[:page], params[:per_page]) }
|
|
563
|
-
end
|
|
564
|
-
|
|
565
|
-
private
|
|
566
|
-
|
|
567
|
-
def filter_by_status(relation, status)
|
|
568
|
-
return relation if status.blank?
|
|
569
|
-
relation.where(status: status)
|
|
570
|
-
end
|
|
571
|
-
|
|
572
|
-
def filter_by_date(relation, start_date, end_date)
|
|
573
|
-
relation = relation.where("created_at >= ?", start_date) if start_date
|
|
574
|
-
relation = relation.where("created_at <= ?", end_date) if end_date
|
|
575
|
-
relation
|
|
576
|
-
end
|
|
577
|
-
|
|
578
|
-
def search_by_title(relation, query)
|
|
579
|
-
return relation if query.blank?
|
|
580
|
-
relation.where("title ILIKE ?", "%#{query}%")
|
|
581
|
-
end
|
|
582
|
-
|
|
583
|
-
def paginate(relation, page, per_page)
|
|
584
|
-
page ||= 1
|
|
585
|
-
per_page ||= 25
|
|
586
|
-
relation.limit(per_page).offset((page.to_i - 1) * per_page.to_i)
|
|
587
|
-
end
|
|
588
|
-
end
|
|
589
|
-
```
|
|
104
|
+
|
|
105
|
+
In factories file, define factory for user with sequence for email, Faker::Name.name for name, and password123 for password. Add admin trait setting role to admin symbol. Add with_posts trait with transient posts_count defaulting to 3, using after create callback to create_list posts for user.
|
|
590
106
|
|
|
591
107
|
---
|
|
592
108
|
|
|
593
109
|
## Advanced Implementation (10+ minutes)
|
|
594
110
|
|
|
595
111
|
For comprehensive coverage including:
|
|
596
|
-
|
|
597
|
-
-
|
|
112
|
+
|
|
113
|
+
- Production deployment patterns for Docker and Kubernetes
|
|
114
|
+
- Advanced ActiveRecord patterns including polymorphic, STI, and query objects
|
|
598
115
|
- Action Cable real-time features
|
|
599
116
|
- Performance optimization techniques
|
|
600
117
|
- Security best practices
|
|
601
118
|
- CI/CD integration patterns
|
|
119
|
+
- Complete RSpec testing patterns
|
|
602
120
|
|
|
603
121
|
See:
|
|
604
|
-
|
|
605
|
-
-
|
|
122
|
+
|
|
123
|
+
- modules/advanced-patterns.md for production patterns and advanced features
|
|
124
|
+
- modules/testing-patterns.md for complete RSpec testing guide
|
|
606
125
|
|
|
607
126
|
---
|
|
608
127
|
|
|
609
128
|
## Context7 Library Mappings
|
|
610
129
|
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
/
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
/
|
|
617
|
-
/
|
|
618
|
-
/thoughtbot/factory_bot - Test data factories
|
|
619
|
-
```
|
|
130
|
+
- rails/rails for Ruby on Rails web framework
|
|
131
|
+
- rspec/rspec for RSpec testing framework
|
|
132
|
+
- hotwired/turbo-rails for Turbo for Rails
|
|
133
|
+
- hotwired/stimulus-rails for Stimulus for Rails
|
|
134
|
+
- sidekiq/sidekiq for background job processing
|
|
135
|
+
- rubocop/rubocop for Ruby style guide enforcement
|
|
136
|
+
- thoughtbot/factory_bot for test data factories
|
|
620
137
|
|
|
621
138
|
---
|
|
622
139
|
|
|
623
140
|
## Works Well With
|
|
624
141
|
|
|
625
|
-
-
|
|
626
|
-
-
|
|
627
|
-
-
|
|
628
|
-
-
|
|
629
|
-
-
|
|
142
|
+
- moai-domain-backend for REST API and web application architecture
|
|
143
|
+
- moai-domain-database for SQL patterns and ActiveRecord optimization
|
|
144
|
+
- moai-workflow-testing for TDD and testing strategies
|
|
145
|
+
- moai-essentials-debug for AI-powered debugging
|
|
146
|
+
- moai-foundation-quality for TRUST 5 quality principles
|
|
630
147
|
|
|
631
148
|
---
|
|
632
149
|
|
|
@@ -635,53 +152,32 @@ See:
|
|
|
635
152
|
Common Issues:
|
|
636
153
|
|
|
637
154
|
Ruby Version Check:
|
|
638
|
-
|
|
639
|
-
ruby
|
|
640
|
-
ruby -e "puts RubyVM::YJIT.enabled?" # Check YJIT status
|
|
641
|
-
```
|
|
155
|
+
|
|
156
|
+
Run ruby with version flag for 3.3 or later. Check YJIT status by running ruby -e with puts RubyVM::YJIT.enabled? command.
|
|
642
157
|
|
|
643
158
|
Rails Version Check:
|
|
644
|
-
|
|
645
|
-
rails
|
|
646
|
-
bundle exec rails about # Full environment info
|
|
647
|
-
```
|
|
159
|
+
|
|
160
|
+
Run rails with version flag for 7.2 or later. Run bundle exec rails about for full environment information.
|
|
648
161
|
|
|
649
162
|
Database Connection Issues:
|
|
650
|
-
|
|
651
|
-
-
|
|
652
|
-
-
|
|
163
|
+
|
|
164
|
+
- Check config/database.yml configuration
|
|
165
|
+
- Ensure PostgreSQL or MySQL service is running
|
|
166
|
+
- Run rails db:create if database does not exist
|
|
653
167
|
|
|
654
168
|
Asset Pipeline Issues:
|
|
655
|
-
```bash
|
|
656
|
-
# Precompile assets
|
|
657
|
-
rails assets:precompile
|
|
658
169
|
|
|
659
|
-
|
|
660
|
-
rails assets:clobber
|
|
661
|
-
```
|
|
170
|
+
Run rails assets:precompile to compile assets. Run rails assets:clobber to clear compiled assets.
|
|
662
171
|
|
|
663
172
|
RSpec Setup Issues:
|
|
664
|
-
```bash
|
|
665
|
-
# Install RSpec
|
|
666
|
-
rails generate rspec:install
|
|
667
|
-
|
|
668
|
-
# Run specific test
|
|
669
|
-
bundle exec rspec spec/models/user_spec.rb
|
|
670
173
|
|
|
671
|
-
|
|
672
|
-
bundle exec rspec --format documentation
|
|
673
|
-
```
|
|
174
|
+
Run rails generate rspec:install for initial setup. Run bundle exec rspec with specific file path for single spec. Run bundle exec rspec with format documentation for verbose output.
|
|
674
175
|
|
|
675
|
-
Turbo
|
|
676
|
-
```bash
|
|
677
|
-
# Rebuild JavaScript
|
|
678
|
-
rails javascript:install:esbuild
|
|
176
|
+
Turbo and Stimulus Issues:
|
|
679
177
|
|
|
680
|
-
|
|
681
|
-
rails turbo:install
|
|
682
|
-
```
|
|
178
|
+
Run rails javascript:install:esbuild for JavaScript setup. Run rails turbo:install for Turbo installation.
|
|
683
179
|
|
|
684
180
|
---
|
|
685
181
|
|
|
686
|
-
Last Updated:
|
|
687
|
-
Status: Active (v1.
|
|
182
|
+
Last Updated: 2026-01-11
|
|
183
|
+
Status: Active (v1.1.0)
|