Curated library of AI agent skills for Ruby on Rails development. Covers code review, architecture, security, testing (RSpec), engines, service objects, DDD patterns, and workflow automation.
98
99%
Does it follow best practices?
Impact
98%
1.38xAverage score across 26 eval scenarios
Passed
No known issues
Rails Agent Skills uses automated validation to ensure plugin manifests are consistent, valid, and compatible across all platforms (Claude Code, Cursor, Windsurf, Codex).
plugin.json files must be valid JSONmarketplace.json files must be valid JSONAll plugin.json files must have:
name — Plugin identifier (should be rails-agent-skills)displayName — Human-readable nameversion — Semantic version (e.g., 1.0.0)author.name — Author namelicense — License (e.g., MIT)Marketplace.json must have:
name — Marketplace identifierdescription — Marketplace descriptionowner — Owner informationplugins — Non-empty array of plugin entriesname, description, version, sourceThese fields must match across all platform configs:
When you update one platform's version, update all platforms to match.
Every SKILL.md file must start with YAML frontmatter:
---
name: skill-name
description: One-line description
type: workflow | skill
---Required fields in frontmatter:
name — Skill identifier (kebab-case)description — Short one-line descriptiontype — Either workflow or skillUse the local validation script to catch issues before pushing:
./scripts/validate-plugins.sh✓ Valid JSON syntax
✓ Field present: name
✓ Field present: displayName
✓ Field present: version
✓ Field present: author
✓ Field present: license
✓ Field present: author.name
✓ Plugin names are consistent: rails-agent-skills
✓ Plugin versions are consistent: 1.0.0
✓ SKILL.md files: 50 validated
✅ All validations passed!To run validation automatically before each commit:
# Create symlink to git hooks
ln -s ../../scripts/validate-plugins.sh .git/hooks/pre-commit
# Make hooks executable
chmod +x .git/hooks/pre-commitNow git commit will run validation. If any checks fail, commit is rejected:
$ git commit -m "Update plugin version"
✗ Plugin versions are inconsistent (Claude: 1.1.0, Cursor: 1.0.0, Windsurf: 1.0.0)
❌ 1 validation(s) failed.Fix the issues and try again:
# Update Cursor and Windsurf versions to match
jq '.version = "1.1.0"' .cursor-plugin/plugin.json > .cursor-plugin/plugin.json.tmp && mv .cursor-plugin/plugin.json.tmp .cursor-plugin/plugin.json
jq '.version = "1.1.0"' .windsurf-plugin/plugin.json > .windsurf-plugin/plugin.json.tmp && mv .windsurf-plugin/plugin.json.tmp .windsurf-plugin/plugin.json
# Retry commit
git commit -m "Update plugin version"The .github/workflows/validate-plugins.yml workflow runs automatically on:
main branch (if plugin files changed)Job: validate-schemas
Job: lint-json
Before merging, GitHub shows validation status:
✓ Validate Plugin Schemas — All required checks passed
✓ Lint JSON Files — JSON properly formattedIf checks fail, details are shown in the workflow logs. Click Details to see what failed.
Run the exact same checks CI would run:
# Validate schemas
jq '.' .claude-plugin/plugin.json > /dev/null
jq '.' .claude-plugin/marketplace.json > /dev/null
jq '.' .cursor-plugin/plugin.json > /dev/null
jq '.' .windsurf-plugin/plugin.json > /dev/null
# Check formatting with prettier (if installed)
npm install -g prettier
prettier --check .claude-plugin/plugin.json
prettier --check .cursor-plugin/plugin.json
prettier --check .windsurf-plugin/plugin.json
# Or use our script
./scripts/validate-plugins.shCause: Version number differs across platform configs.
Fix: Update all plugin.json files to the same version:
# Update all platform versions at once
NEW_VERSION="1.1.0"
jq ".version = \"$NEW_VERSION\"" .claude-plugin/plugin.json > .claude-plugin/plugin.json.tmp && mv .claude-plugin/plugin.json.tmp .claude-plugin/plugin.json
jq ".version = \"$NEW_VERSION\"" .cursor-plugin/plugin.json > .cursor-plugin/plugin.json.tmp && mv .cursor-plugin/plugin.json.tmp .cursor-plugin/plugin.json
jq ".version = \"$NEW_VERSION\"" .windsurf-plugin/plugin.json > .windsurf-plugin/plugin.json.tmp && mv .windsurf-plugin/plugin.json.tmp .windsurf-plugin/plugin.jsonCause: Malformed JSON (trailing comma, unclosed brace, etc.)
Fix: Use jq to validate and pretty-print:
# Check which file has bad JSON
jq '.' .claude-plugin/plugin.json
# Fix by reformatting
jq '.' .claude-plugin/plugin.json > .claude-plugin/plugin.json.tmp && mv .claude-plugin/plugin.json.tmp .claude-plugin/plugin.jsonCause: Required field is not present in the manifest.
Fix: Add the missing field:
# Example: add displayName if missing
jq '.displayName = "Rails Agent Skills"' .claude-plugin/plugin.json > .claude-plugin/plugin.json.tmp && mv .claude-plugin/plugin.json.tmp .claude-plugin/plugin.jsonCause: A skill file doesn't start with --- or is missing required YAML fields.
Fix: Add frontmatter to the skill file:
---
name: my-skill
description: Brief description of what this skill does
type: skill
---
# Skill Name
[Rest of content...]Cause: name field differs across platform configs.
Fix: Ensure all configs use the same name:
# Verify all names match
echo "Claude: $(jq -r '.name' .claude-plugin/plugin.json)"
echo "Cursor: $(jq -r '.name' .cursor-plugin/plugin.json)"
echo "Windsurf: $(jq -r '.name' .windsurf-plugin/plugin.json)"
# If they don't match, update them
jq '.name = "rails-agent-skills"' .cursor-plugin/plugin.json > .cursor-plugin/plugin.json.tmp && mv .cursor-plugin/plugin.json.tmp .cursor-plugin/plugin.jsonInstall jq:
# macOS
brew install jq
# Linux (Ubuntu/Debian)
sudo apt-get install jq
# Linux (Red Hat/CentOS)
sudo yum install jqMake the validation script executable:
chmod +x ./scripts/validate-plugins.shThe CI workflow installs prettier automatically. To test locally:
npm install -g prettierVerify the symlink is correct:
# Check if hook exists and is executable
ls -la .git/hooks/pre-commit
# Recreate if needed
rm .git/hooks/pre-commit
ln -s ../../scripts/validate-plugins.sh .git/hooks/pre-commit
chmod +x .git/hooks/pre-commitUpdate the version in all three plugin.json files:
.claude-plugin/plugin.json
.cursor-plugin/plugin.json
.windsurf-plugin/plugin.jsonRun local validation:
./scripts/validate-plugins.shCommit with a clear message:
git commit -m "Bump plugin version to 1.1.0"Create the skill directory and SKILL.md:
mkdir my-new-skill
echo "---
name: my-new-skill
description: What this skill does
type: skill
---" > my-new-skill/SKILL.mdRun validation to ensure frontmatter is correct:
./scripts/validate-plugins.shCommit:
git commit -am "Add my-new-skill"Run full validation:
./scripts/validate-plugins.shVerify CI passes in GitHub Actions
Merge PR
The validation pipeline ensures:
This prevents configuration drift and ensures Rails Agent Skills works correctly across Claude Code, Cursor, Windsurf, and Codex.
api-rest-collection
create-prd
ddd-boundaries-review
ddd-rails-modeling
ddd-ubiquitous-language
docs
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
generate-tasks
mcp_server
rails-architecture-review
rails-background-jobs
rails-bug-triage
rails-code-conventions
rails-code-review
rails-engine-compatibility
rails-engine-docs
rails-engine-extraction
rails-engine-installers
rails-engine-release
rails-engine-reviewer
rails-engine-testing
rails-graphql-best-practices
rails-migration-safety
rails-review-response
rails-security-review
rails-skills-orchestrator
rails-stack-conventions
rails-tdd-slices
refactor-safely
rspec-best-practices
rspec-service-testing
ruby-service-objects
strategy-factory-null-calculator
ticket-planning
yard-documentation