Curated library of 42 public AI agent skills for Ruby on Rails development, plus 5 callable workflow skills. Organized by category: planning, testing, code-quality, ddd, engines, infrastructure, api, patterns, context, orchestration, and workflows. Covers code review, architecture, security, testing (RSpec), engines, service objects, DDD patterns, and TDD automation.
96
96%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Risky
Do not use without reviewing
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.
build
docs
mcp_server
skills
api
generate-api-collection
implement-graphql
code-quality
apply-code-conventions
apply-stack-conventions
assets
snippets
code-review
refactor-code
respond-to-review
review-architecture
security-check
context
load-context
setup-environment
ddd
define-domain-language
model-domain
review-domain-boundaries
engines
create-engine
create-engine-installer
document-engine
extract-engine
release-engine
review-engine
test-engine
upgrade-engine
infrastructure
implement-background-job
implement-hotwire
optimize-performance
review-migration
seed-database
version-api
orchestration
skill-router
patterns
create-service-object
implement-calculator-pattern
write-yard-docs
planning
create-prd
generate-tasks
plan-tickets
testing
plan-tests
test-service
triage-bug
write-tests
workflows