AiderRuby
A Ruby gem that serves as a wrapper for aider, enabling LLM configuration and execution of AI-assisted programming tasks.
🏗️ Architecture
AiderRuby uses a modular architecture to organize code in a clear and maintainable way:
- Specialized configuration modules: Each option category has its own module
- Robust error handling: Specialized error types with contextual handling
- Integrated validation: Automatic parameter validation
- Fluid API: Chainable methods for intuitive configuration
- Compatibility: Maintains existing API with aliases
See ARCHITECTURE.md for more details on the architecture.
Installation
gem install aider-ruby
Or add it to your Gemfile:
gem 'aider-ruby'
Usage
Command Line Interface
# Execute aider with a message
aider-ruby execute "Create a function to calculate factorial"
# Interactive mode
aider-ruby interactive
# Use a specific model
aider-ruby execute "Refactor this code" --model claude-3-5-sonnet-20241022
# Add files
aider-ruby execute "Improve this function" --files app/models/user.rb
# Verbose mode
aider-ruby execute "Debug this issue" --verbose
# List available models
aider-ruby models
# Model information
aider-ruby model_info gpt-4o
# Recommended models
aider-ruby recommended
# Load coding conventions
aider-ruby conventions CONVENTIONS.md
# Set edit format
aider-ruby edit_format diff
# Show reasoning settings
aider-ruby reasoning_settings
# Execute with advanced parameters
aider-ruby execute "Task" --reasoning-effort high --thinking-tokens 8k --edit-format diff-fenced
Programmatic Usage
require 'aider_ruby'
# Create a client
client = AiderRuby.new_client(
model: 'claude-3-5-sonnet-20241022',
openai_api_key: 'your-key',
anthropic_api_key: 'your-key'
)
# Add files
client.add_files('app/models/user.rb')
client.add_files(['app/models/user.rb', 'app/models/post.rb']) # Multiple files
client.add_read_only_file('README.md')
client.add_read_only_file(['docs/api.md', 'docs/guide.md']) # Multiple read-only files
# Add entire folders
client.add_folder('app/models', extensions: ['.rb']) # Only Ruby files
client.add_read_only_folder('docs', exclude_patterns: ['temp/', /\.tmp$/]) # Exclude patterns
# Configure coding conventions
client.conventions_files(['CONVENTIONS.md', 'STYLE_GUIDE.md']) # Multiple files
client.add_read_files(['docs/guidelines.md', 'examples/patterns.rb']) # Basic usage
client.add_read_files(['docs/'], extensions: ['.md'], exclude_patterns: ['temp/']) # With filtering
# Configure edit formats
client.edit_format_diff(true)
client.editor_edit_format_diff_fenced(true)
# Advanced model configuration
client.use_temperature(true)
client.use_system_prompt(true)
client.use_repo_map(true)
client.reasoning_effort('high')
client.thinking_tokens('8k')
# Add model aliases
client.add_alias('sonnet', 'claude-3-5-sonnet-20241022')
client.add_alias('fast', 'claude-3-5-haiku-20241022')
# Execute a task
result = client.execute("Create tests for this class")
puts result
# Interactive mode
client.interactive
# Advanced configuration
client
.model('gpt-4o')
.add_files('app/models/user.rb')
.dark_mode(true)
.auto_commits(true)
.lint(true)
.execute("Refactor this code")
Error Handling
AiderRuby provides robust error handling with specialized error types:
begin
client = AiderRuby.new_client(model: 'invalid-model')
rescue AiderRuby::ErrorHandling::ModelError => e
puts "Model error: #{e.message}"
rescue AiderRuby::ErrorHandling::ConfigurationError => e
puts "Configuration error: #{e.message}"
rescue AiderRuby::ErrorHandling::ExecutionError => e
puts "Execution error: #{e.message}"
rescue AiderRuby::ErrorHandling::FileError => e
puts "File error: #{e.message}"
rescue AiderRuby::ErrorHandling::ValidationError => e
puts "Validation error: #{e.message}"
end
Parameter Validation
Validation is automatic during configuration:
# ✅ Valid formats
client.edit_format_diff(true)
client.reasoning_effort('high')
client.thinking_tokens('8k')
# ❌ Invalid formats (raise ValidationError)
client.edit_format('invalid')
client.reasoning_effort('invalid')
client.thinking_tokens('invalid')
File Management
AiderRuby provides flexible file management options:
Adding Files for Editing
# Single file
client.add_files('app/models/user.rb')
# Multiple files
client.add_files(['app/models/user.rb', 'app/models/post.rb'])
# Entire folder (with filters)
client.add_folder('app/models',
extensions: ['.rb'], # Only Ruby files
exclude_patterns: ['spec/', /_test\.rb$/] # Exclude test files
)
Adding Files for Context (Read-Only)
# Single read-only file
client.add_read_only_file('README.md')
# Multiple read-only files
client.add_read_only_file(['docs/api.md', 'docs/guide.md'])
# Entire folder as context
client.add_read_only_folder('docs',
extensions: ['.md', '.txt'],
exclude_patterns: ['temp/', /\.tmp$/]
)
# Using conventions (alternative method)
client.add_read_files(['docs/guidelines.md', 'examples/patterns.rb'])
Key Differences
-
add_files()
: Files that aider can modify/edit (uses--file
flag) -
add_read_only_file()
: Files for context only (uses--read
flag) -
add_read_files()
: Alternative method for read-only files (stored in config) -
add_folder()
: Recursively adds all files in a folder for editing -
add_read_only_folder()
: Recursively adds all files in a folder as context
Enhanced Convention Management
AiderRuby provides advanced convention management with validation and filtering:
Single Convention File
# Basic usage with validation (default)
client.conventions_files(['CONVENTIONS.md'])
# Skip validation for non-existent files
client.conventions_files(['CONVENTIONS.md'], validate: false)
Multiple Convention Files
# Add multiple convention files
client.conventions_files(['CONVENTIONS.md', 'STYLE_GUIDE.md', 'PATTERNS.md'])
# With validation disabled
client.conventions_files(['CONVENTIONS.md', 'STYLE_GUIDE.md'], validate: false)
Enhanced Read Files Management
# Basic usage
client.add_read_files(['docs/guidelines.md', 'examples/patterns.rb'])
# With filtering by extensions
client.add_read_files(['docs/'], extensions: ['.md', '.txt'])
# With exclusion patterns
client.add_read_files(['docs/'],
extensions: ['.md'],
exclude_patterns: ['temp/', /\.tmp$/, 'draft/']
)
# Skip validation
client.add_read_files(['docs/'], validate: false)
# Add from entire folder with filtering
client.add_read_files_from_folder('docs',
extensions: ['.md', '.txt'],
exclude_patterns: ['temp/', /\.tmp$/]
)
# Clear all read files
client.clear_read_files
# Get list of read files
files = client.read_files_list
Key Differences
-
conventions_files()
: Convention files with validation (single or multiple) -
add_read_files()
: Enhanced method with filtering and validation -
add_read_files_from_folder()
: Add files from folder with filtering -
clear_read_files()
: Clear all read files -
read_files_list()
: Get current list of read files
Complete In-Code Configuration
AiderRuby allows complete configuration without external files or environment variables:
# Complete configuration in code
client = AiderRuby.new_client(
# Model configuration
model: 'claude-3-5-sonnet-20241022',
anthropic_api_key: 'sk-ant-your-key',
reasoning_effort: 'high',
thinking_tokens: '8k',
# Output configuration
dark_mode: true,
pretty: true,
stream: true,
show_diffs: true,
# Git configuration
git: true,
auto_commits: true,
dirty_commits: false,
# Linting and testing
lint: true,
auto_lint: true,
test: true,
auto_test: true,
# General settings
verbose: true,
encoding: 'utf-8',
suggest_shell_commands: true,
fancy_input: true,
detect_urls: true,
# Conventions and files
conventions_files: ['CONVENTIONS.md'],
read_files: ['README.md'],
# Edit formats
edit_format_diff: true
)
# Add files and execute
client
.add_files(['app/models/user.rb', 'app/models/post.rb'])
.add_read_only_file('docs/api.md')
.execute("Refactor this code")
Configuration with Files
# YAML Configuration
AiderRuby.configure do
model 'claude-3-5-sonnet-20241022'
openai_api_key ENV['OPENAI_API_KEY']
anthropic_api_key ENV['ANTHROPIC_API_KEY']
dark_mode true
auto_commits true
lint true
auto_lint true
end
# Load from file
AiderRuby::Config.load_from_file('config/aider.yml')
AiderRuby::Config.load_from_env_file('.env')
Specialized Task Execution
client = AiderRuby.new_client
executor = AiderRuby::TaskExecutor.new(client)
# Coding task
executor.execute_coding_task(
"Implement a REST API",
['app/controllers/api_controller.rb']
)
# Refactoring task
executor.execute_refactoring_task(
"Refactor this class to follow SOLID principles",
['app/models/user.rb']
)
# Debugging task
executor.execute_debugging_task(
"Fix errors in this function",
['app/services/payment_service.rb']
)
# Documentation task
executor.execute_documentation_task(
"Create API documentation",
['app/controllers/api_controller.rb']
)
# Test generation
executor.execute_test_generation_task(
"Generate comprehensive unit tests",
['app/models/user.rb']
)
# Multi-step task
steps = [
"Analyze existing code",
"Identify possible improvements",
"Implement changes",
"Create tests"
]
executor.execute_multi_step_task(steps, ['app/models/user.rb'])
Model Management
# List available models
AiderRuby::Models.list_models
AiderRuby::Models.list_models(:openai)
# Check if a model is supported
AiderRuby::Models.supported_model?('gpt-4o')
# Get model provider
AiderRuby::Models.provider_for_model('gpt-4o')
# Check capabilities
AiderRuby::Models.is_reasoning_model?('o1-preview')
AiderRuby::Models.has_vision?('gpt-4o')
# Detailed information
info = AiderRuby::Models.model_info('gpt-4o')
puts "Context: #{info[:context_window]} tokens"
puts "Cost: $#{info[:cost_per_token][:input]} per 1M tokens"
# Recommended models
AiderRuby::Models.recommended_models
Configuration
Environment Variables
export OPENAI_API_KEY="your-openai-key"
export ANTHROPIC_API_KEY="your-anthropic-key"
export AIDER_MODEL="claude-3-5-sonnet-20241022"
export AIDER_DARK_MODE="true"
export AIDER_AUTO_COMMITS="true"
YAML Configuration File
# config/aider.yml
model: claude-3-5-sonnet-20241022
openai_api_key: ${OPENAI_API_KEY}
anthropic_api_key: ${ANTHROPIC_API_KEY}
dark_mode: true
light_mode: false
pretty: true
stream: true
git: true
auto_commits: true
dirty_commits: false
lint: true
auto_lint: true
test: true
auto_test: true
verbose: false
encoding: utf-8
line_endings: platform
suggest_shell_commands: true
fancy_input: true
multiline: false
notifications: false
detect_urls: true
voice_format: wav
voice_language: en
.env File
# .env
OPENAI_API_KEY=your-openai-key
ANTHROPIC_API_KEY=your-anthropic-key
AIDER_MODEL=claude-3-5-sonnet-20241022
AIDER_DARK_MODE=true
AIDER_AUTO_COMMITS=true
Features
Supported Models
- OpenAI: gpt-4o, gpt-4o-mini, gpt-4-turbo, gpt-4, gpt-3.5-turbo, o1-preview, o1-mini
- Anthropic: claude-3-5-sonnet, claude-3-5-haiku, claude-3-opus, claude-3-sonnet, claude-3-haiku
- Google: gemini-1.5-pro, gemini-1.5-flash, gemini-pro
- GROQ: llama-3.1-70b-versatile, llama-3.1-8b-instant, mixtral-8x7b-32768, gemma-7b-it
- DeepSeek: deepseek-chat, deepseek-coder
- xAI: grok-beta
- Cohere: command-r-plus, command-r, command-light
Task Types
- Coding: Development of new features
- Refactoring: Improvement of existing code
- Debugging: Problem resolution
- Documentation: Documentation creation
- Test Generation: Test generation
- Multi-step: Complex multi-step tasks
Configuration Options
- Model and API key configuration
- Reasoning parameters (reasoning_effort, thinking_tokens)
- Output options (dark_mode, pretty, stream)
- Git integration (auto_commits, dirty_commits)
- Automatic linting and testing
- Voice parameters
- Advanced model configuration
- Coding conventions: Support for convention files
- Edit formats: whole, diff, diff-fenced
- Advanced parameters: temperature, system prompt, repo map
- Model aliases: Custom alias definitions
- Model metadata: Capability and cost configuration
Development
Install Dependencies
bundle install
Tests
bundle exec rspec
Linting
bundle exec rubocop
Build Gem
gem build aider-ruby.gemspec
gem install ./aider-ruby-0.1.0.gem
License
MIT License
Contributing
Contributions are welcome! Feel free to open an issue or pull request.