Curated library of 39 AI agent skills for Ruby on Rails development. Organized by category: planning, testing, code-quality, ddd, engines, infrastructure, api, patterns, context, orchestration, and workflows. Includes 5 callable workflow skills (rails-tdd-loop, rails-review-flow, rails-setup-flow, rails-quality-flow, rails-engines-flow) for complete development cycles. Covers code review, architecture, security, testing (RSpec), engines, service objects, DDD patterns, and TDD automation.
95
98%
Does it follow best practices?
Impact
95%
1.20xAverage score across 35 eval scenarios
Passed
No known issues
Complete examples for managing development and test data.
# db/seeds.rb
# Admin user - idempotent with find_or_create_by!
admin = User.find_or_create_by!(email: 'admin@example.com') do |u|
u.password = 'secure_password'
u.admin = true
u.confirmed_at = Time.now
end
# Reference data - using first_or_create for lookup tables
['pending', 'processing', 'completed', 'cancelled'].each do |status|
OrderStatus.find_or_create_by!(name: status)
end
# Bulk creation with validation
if User.count < 10
10.times do |n|
User.create_with(
password: 'password',
confirmed_at: Time.now
).find_or_create_by!(email: "user#{n}@example.com")
end
enddb/
├── seeds.rb # Base seeds (always runs)
└── seeds/
├── development.rb # Dev-specific (100 fake users)
├── test.rb # Test-specific (minimal data)
└── staging.rb # Staging-specific# db/seeds.rb (bottom of file)
# Load environment-specific seeds
env_seed_file = Rails.root.join("db/seeds/#{Rails.env}.rb")
load env_seed_file if env_seed_file.exist?# db/seeds/development.rb
puts "Loading development seeds..."
# Load base seeds first
load Rails.root.join('db/seeds.rb')
# Create fake data
require 'faker'
50.times do
User.create!(
email: Faker::Internet.unique.email,
name: Faker::Name.name,
password: 'password',
confirmed_at: Time.now
)
end
# Complex relationships
users = User.limit(10)
users.each do |user|
5.times do
Post.create!(
user: user,
title: Faker::Lorem.sentence,
body: Faker::Lorem.paragraphs(number: 3).join("\n\n"),
published_at: [nil, Time.now - rand(30).days].sample
)
end
end# spec/factories/users.rb
FactoryBot.define do
factory :user do
sequence(:email) { |n| "user#{n}@example.com" }
password { 'password123' }
name { 'Test User' }
confirmed_at { Time.now }
trait :admin do
admin { true }
end
trait :unconfirmed do
confirmed_at { nil }
end
end
end# spec/factories/posts.rb
FactoryBot.define do
factory :post do
sequence(:title) { |n| "Post #{n}" }
body { Faker::Lorem.paragraphs.join("\n\n") }
user
trait :published do
published_at { Time.now }
end
trait :draft do
published_at { nil }
end
# Create comments with the post
after(:create) do |post|
create_list(:comment, 3, post: post)
end
end
end# db/seeds/development.rb
# Mix of factories and manual creation
admin = FactoryBot.create(:user, :admin, email: 'admin@example.com')
regular_users = FactoryBot.create_list(:user, 10)
# Create posts for each user
regular_users.each do |user|
FactoryBot.create_list(:post, 3, :published, user: user)
FactoryBot.create_list(:post, 2, :draft, user: user)
end| Scenario | Recommendation |
|---|---|
| Static reference data (roles, statuses) | Seeds with find_or_create_by! |
| Complex relationships | FactoryBot |
| Performance-critical tests | Fixtures |
| Integration tests | Factories for realism |
| Unit tests | Factories for isolation |
# Full reset
rails db:drop db:create db:migrate db:seed
# Quick reset (keep structure)
rails db:seed:replant# db/seeds.rb
begin
User.create!(email: 'test@example.com')
rescue ActiveRecord::RecordInvalid => e
puts "Failed to create user: #{e.message}"
puts e.record.errors.full_messages
enddocs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
scenario-17
scenario-18
scenario-19
scenario-20
scenario-21
scenario-22
scenario-23
scenario-24
scenario-25
scenario-26
scenario-27
scenario-28
scenario-29
scenario-30
scenario-31
scenario-32
scenario-33
scenario-34
scenario-35
mcp_server
skills
api
api-rest-collection
rails-graphql-best-practices
code-quality
rails-architecture-review
rails-code-conventions
rails-code-review
rails-review-response
rails-security-review
rails-stack-conventions
assets
snippets
refactor-safely
context
rails-context-engineering
rails-project-onboarding
ddd
ddd-boundaries-review
ddd-rails-modeling
ddd-ubiquitous-language
engines
rails-engine-compatibility
rails-engine-docs
rails-engine-extraction
rails-engine-installers
rails-engine-release
rails-engine-reviewer
rails-engine-testing
infrastructure
rails-api-versioning
rails-background-jobs
rails-database-seeding
rails-frontend-hotwire
rails-migration-safety
rails-performance-optimization
orchestration
rails-skills-orchestrator
patterns
ruby-service-objects
strategy-factory-null-calculator
yard-documentation
planning
create-prd
generate-tasks
ticket-planning
testing
rails-bug-triage
rails-tdd-slices
rspec-best-practices
rspec-service-testing