3.9 KiB
3.9 KiB
Rails Version Detector
name: rails-version-detector description: Detects Rails version from project files (Gemfile.lock, Gemfile, or .ruby-version) version: 1.1.0 author: Rails Workflow Team tags: [rails, version, detection, helper] priority: 2
Purpose
Automatically detects the Rails version in the current project by inspecting:
Gemfile.lock(preferred - exact version)Gemfile(fallback - version constraint).ruby-versionor.tool-versions(Ruby version hint)
Returns version information for use by other skills and agents.
Usage
This skill is auto-invoked by other Rails skills when they need version information.
Manual invocation (rarely needed):
@rails-version-detector
Detection Strategy
Priority 1: Gemfile.lock (Exact Version)
# Searches for:
rails (7.1.3)
actioncable (= 7.1.3)
actionmailbox (= 7.1.3)
...
Extraction logic:
- Pattern:
rails \((\d+\.\d+\.\d+)\) - Returns: Exact version (e.g., "7.1.3")
Priority 2: Gemfile (Version Constraint)
# Searches for:
gem "rails", "~> 7.1.0"
gem 'rails', '>= 7.0.0', '< 8.0'
Extraction logic:
- Pattern:
gem ['"]rails['"],\s*['"]([^'"]+)['"] - Returns: Version constraint (e.g., "~> 7.1.0")
- Interprets: "~> 7.1.0" → "7.1.x"
Priority 3: Ruby Version (Heuristic)
# .ruby-version or .tool-versions
ruby 3.2.2
Mapping:
- Ruby 3.3.x → Rails 7.1+ or 8.0+
- Ruby 3.2.x → Rails 7.0+
- Ruby 3.1.x → Rails 7.0+
- Ruby 3.0.x → Rails 6.1+ or 7.0
- Ruby 2.7.x → Rails 6.0 or 6.1
Returns: Estimated range (e.g., "7.0 or 7.1")
Output Format
Success Response
{
"version": "7.1.3",
"source": "Gemfile.lock",
"confidence": "exact",
"major": 7,
"minor": 1,
"patch": 3
}
Constraint Response
{
"version": "~> 7.1.0",
"source": "Gemfile",
"confidence": "constraint",
"interpreted_as": "7.1.x",
"major": 7,
"minor": 1
}
Heuristic Response
{
"version": "7.0-7.1",
"source": ".ruby-version",
"confidence": "heuristic",
"ruby_version": "3.2.2",
"possible_rails": ["7.0", "7.1"]
}
Not Found Response
{
"version": null,
"source": null,
"confidence": "none",
"error": "No Rails version detected. Is this a Rails project?"
}
Implementation
Tool usage:
Readtool to read Gemfile.lock, Gemfile, .ruby-versionGreptool to search for version patterns- Fallback to
Bashif needed:bundle show rails | grep 'rails-'
Caching:
- Version detection results cached for session
- Re-check if Gemfile.lock modified (check mtime)
Error Handling
Gemfile.lock missing:
- Fallback to Gemfile
- Warn: "Gemfile.lock not found. Run
bundle installfor exact version."
No version found:
- Return error response
- Suggest: "Ensure
gem 'rails'in Gemfile"
Multiple Rails versions:
- Return first match (main Rails gem)
- Ignore: railties, actionpack (these are sub-gems)
Integration
Auto-invoked by:
- @rails-docs-search (to fetch correct version docs)
- @rails-api-lookup (to search version-specific APIs)
- @rails-pattern-finder (to find version-appropriate patterns)
- All 7 Rails agents (to ensure version-compatible code generation)
Manual use case:
User: "What Rails version is this project using?"
Assistant: *invokes @rails-version-detector*
"This project uses Rails 7.1.3 (detected from Gemfile.lock)"
Testing
Test cases:
- Rails 7.1.3 in Gemfile.lock → Exact version
~> 7.1.0in Gemfile → Interpreted as 7.1.x- Ruby 3.2.2 only → Heuristic: 7.0-7.1
- No Rails → Error response
- Rails 8.0.0 → Correct major version detection
Notes
- This skill replaces the need for
mcp__rails__get_rails_infoMCP tool - Version detection is fast (< 1 second)
- Results cached per session to avoid repeated file reads
- Confidence levels help downstream skills decide if they need clarification from user