Use when configuring Ameba rules and settings for Crystal projects including .ameba.yml setup, rule management, severity levels, and code quality enforcement.
Limited to specific tools
Additional assets for this skill
This skill is limited to using the following tools:
name: ameba-configuration description: Use when configuring Ameba rules and settings for Crystal projects including .ameba.yml setup, rule management, severity levels, and code quality enforcement. allowed-tools:
Configure Ameba, the static code analysis tool for Crystal, to enforce consistent code style and catch code smells in your Crystal projects.
Ameba is a static code analysis tool for the Crystal programming language that:
# Generate a new configuration file with all defaults
ameba --gen-config
# This creates .ameba.yml with all available rules and their default settings
# .ameba.yml - Complete example configuration
# Global source configuration
Globs:
- "**/*.cr" # Include all Crystal files
- "**/*.ecr" # Include Embedded Crystal files
- "!lib" # Exclude dependencies
Excluded:
- src/legacy/** # Exclude legacy code
- spec/fixtures/** # Exclude test fixtures
# Rule categories and individual rules
Lint/UnusedArgument:
Enabled: true
Severity: Warning
Style/RedundantReturn:
Enabled: true
Severity: Convention
Performance/AnyInsteadOfEmpty:
Enabled: true
Severity: Warning
# Include specific patterns
Globs:
- "**/*.cr" # All Crystal source files
- "**/*.ecr" # All Embedded Crystal templates
- "!lib/**" # Exclude lib directory
- "!vendor/**" # Exclude vendor directory
# Common patterns
# - "src/**/*.cr" # Only src directory
# - "spec/**/*.cr" # Only spec directory
# - "!**/*_test.cr" # Exclude test files
# Global exclusions (applied to all rules)
Excluded:
- src/compiler/** # Exclude specific directories
- src/legacy/**
- spec/fixtures/**
- db/migrations/** # Often excluded from style checks
# Real-world example
Globs:
- "**/*.cr"
- "!lib"
Excluded:
- src/external/generated/** # Generated code
- src/legacy/** # Legacy code being refactored
- spec/support/fixtures/** # Test data
# Example 1: Standard web application
Globs:
- "src/**/*.cr"
- "spec/**/*.cr"
- "!lib"
Excluded:
- src/assets/**
- spec/fixtures/**
# Example 2: Library/Shard
Globs:
- "src/**/*.cr"
- "spec/**/*.cr"
- "examples/**/*.cr"
- "!lib"
Excluded:
- spec/support/**
# Example 3: Monorepo
Globs:
- "apps/**/src/**/*.cr"
- "apps/**/spec/**/*.cr"
- "packages/**/src/**/*.cr"
- "!lib"
- "!**/node_modules/**"
Excluded:
- apps/legacy/**
Lint rules catch potential bugs and incorrect code:
# Unused variables and arguments
Lint/UnusedArgument:
Enabled: true
Severity: Warning
# Catches: def process(data, unused_param)
Lint/UselessAssign:
Enabled: true
Severity: Warning
# Catches: x = 5; x = 10 # First assignment never used
# Shadowed variables
Lint/ShadowingOuterLocalVar:
Enabled: true
Severity: Warning
# Catches: x = 1; proc { |x| x } # x shadows outer x
# Unreachable code
Lint/UnreachableCode:
Enabled: true
Severity: Error
# Catches: return x; do_something() # Never executes
# Syntax issues
Lint/Syntax:
Enabled: true
Severity: Error
# Catches syntax errors before compilation
# Empty blocks
Lint/EmptyBlock:
Enabled: true
Severity: Warning
ExcludeEmptyBlocks: false
# Catches: items.each { }
# Debugger statements
Lint/DebuggerStatement:
Enabled: true
Severity: Warning
# Catches: debugger; pp value
Style rules enforce Crystal code conventions:
# Naming conventions
Style/ConstantNames:
Enabled: true
Severity: Convention
# Enforces: CONSTANT_NAME not Constant_Name
Style/MethodNames:
Enabled: true
Severity: Convention
# Enforces: method_name not methodName
Style/TypeNames:
Enabled: true
Severity: Convention
# Enforces: ClassName not Class_Name
# Predicate methods
Style/PredicateName:
Enabled: true
Severity: Convention
# Enforces: empty? not is_empty
# Redundant code
Style/RedundantReturn:
Enabled: true
Severity: Convention
AllowMultipleReturnValues: true
# Catches: def foo; return 42; end
# Prefers: def foo; 42; end
Style/RedundantBegin:
Enabled: true
Severity: Convention
# Catches: def foo; begin; 42; end; end
# Prefers: def foo; 42; end
# Large numbers
Style/LargeNumbers:
Enabled: true
Severity: Convention
IntMinDigits: 5
# Enforces: 100_000 not 100000
# Parentheses
Style/ParenthesesAroundCondition:
Enabled: true
Severity: Convention
# Enforces: if x > 5 not if (x > 5)
# String literals
Style/StringLiterals:
Enabled: true
Severity: Convention
# Catches inconsistent quote usage
# Variable names
Style/VariableNames:
Enabled: true
Severity: Convention
# Enforces: snake_case not camelCase
Performance rules identify inefficient code patterns:
# Inefficient any? usage
Performance/AnyInsteadOfEmpty:
Enabled: true
Severity: Warning
FilterFirstNegativeCondition: true
# Catches: array.any?
# Prefers: !array.empty?
# Size after filter
Performance/SizeAfterFilter:
Enabled: true
Severity: Warning
FilterNames: [select, reject]
# Catches: items.select(&.active?).size
# Prefers: items.count(&.active?)
# Compact after map
Performance/CompactAfterMap:
Enabled: true
Severity: Warning
# Catches: items.map(&.value?).compact
# Prefers: items.compact_map(&.value?)
# Flatten after map
Performance/FlattenAfterMap:
Enabled: true
Severity: Warning
# Catches: items.map(&.children).flatten
# Prefers: items.flat_map(&.children)
# Enable/disable individual rules
Style/LargeNumbers:
Enabled: true # or false to disable
# Set severity levels
Style/RedundantReturn:
Enabled: true
Severity: Warning # Error, Warning, Convention
# Configure rule-specific options
Style/LargeNumbers:
Enabled: true
Severity: Convention
IntMinDigits: 5 # Minimum digits before requiring underscores
Lint/UnusedArgument:
Enabled: true
IgnoreTypeDeclarations: false
IgnoreParameterNames: [] # Parameter names to ignore
# Exclude files from specific rules
Style/RedundantBegin:
Enabled: true
Excluded:
- src/server/processor.cr
- src/server/api.cr
# Custom severity levels
Lint/UselessAssign:
Enabled: true
Severity: Error # Make this an error, not warning
Style/RedundantReturn:
Enabled: true
Severity: Convention
AllowMultipleReturnValues: true # Allow: return x, y
# Ignore specific parameter patterns
Lint/UnusedArgument:
Enabled: true
IgnoreParameterNames:
- "_*" # Ignore params starting with underscore
- "unused_*" # Ignore params prefixed with unused_
# Configure numeric formatting
Style/LargeNumbers:
Enabled: true
IntMinDigits: 5 # 10000 requires underscores
# 1000 is fine, 10000 should be 10_000
# Performance tuning
Performance/SizeAfterFilter:
Enabled: true
FilterNames:
- select
- reject
- filter
# Error: Must be fixed (blocks CI typically)
Lint/Syntax:
Severity: Error
# Warning: Should be fixed (important issues)
Lint/UnusedArgument:
Severity: Warning
# Convention: Style preference (less critical)
Style/RedundantReturn:
Severity: Convention
# Conservative approach (CI-friendly)
# Only errors block builds
Lint/Syntax:
Severity: Error
Lint/UnreachableCode:
Severity: Error
Style/RedundantReturn:
Severity: Warning
Style/LargeNumbers:
Severity: Convention
# Strict approach (enforce everything)
# All issues treated as errors
Lint/UnusedArgument:
Severity: Error
Style/RedundantReturn:
Severity: Error
Style/VariableNames:
Severity: Error
# Progressive approach (gradually increase strictness)
# Start with warnings, move to errors over time
Lint/UselessAssign:
Severity: Warning # Will become Error after cleanup
Style/RedundantBegin:
Severity: Convention # Will become Warning after team adapts
# Disable single rule for one line
time = Time.epoch(1483859302) # ameba:disable Style/LargeNumbers
# Disable multiple rules for one line
result = calculate() # ameba:disable Style/RedundantReturn, Lint/UselessAssign
# Disable rule categories
# ameba:disable Style, Lint
def legacy_method
# Old code with known issues
end
# ameba:enable Style, Lint
# Disable specific rule for block
# ameba:disable Style/RedundantBegin
def process
begin
perform_operation
rescue
handle_error
end
end
# ameba:enable Style/RedundantBegin
# Common patterns
class LegacyService
# ameba:disable Lint/UnusedArgument
def process(data, context)
# Only using data for now
data.process
end
# ameba:enable Lint/UnusedArgument
end
# GOOD - Specific and temporary
def parse_timestamp(value)
Time.epoch(1483859302) # ameba:disable Style/LargeNumbers
end
# GOOD - With explanation
# This API requires exact numeric format
# ameba:disable Style/LargeNumbers
LEGACY_TIMESTAMP = 1483859302
# ameba:enable Style/LargeNumbers
# BAD - Too broad
# ameba:disable Style
# Disables all style rules - too permissive
def messy_method
# ...
end
# BAD - Never re-enabled
# ameba:disable Lint/UselessAssign
# Disables for rest of file
# GOOD - Scoped to minimum area
def external_api_call
# ameba:disable Style/VariableNames
responseData = call_api() # External API uses camelCase
# ameba:enable Style/VariableNames
response_data = responseData # Convert to Crystal convention
end
# .ameba.yml - Minimal setup for new projects
Globs:
- "**/*.cr"
- "!lib"
# Only enable critical rules
Lint/Syntax:
Enabled: true
Severity: Error
Lint/UnreachableCode:
Enabled: true
Severity: Error
# .ameba.yml - Standard configuration for most projects
Globs:
- "**/*.cr"
- "**/*.ecr"
- "!lib"
Excluded:
- spec/fixtures/**
# Lint rules (errors and warnings)
Lint/Syntax:
Enabled: true
Severity: Error
Lint/UnusedArgument:
Enabled: true
Severity: Warning
Lint/UselessAssign:
Enabled: true
Severity: Warning
Lint/UnreachableCode:
Enabled: true
Severity: Error
# Style rules (conventions)
Style/RedundantReturn:
Enabled: true
Severity: Convention
Style/RedundantBegin:
Enabled: true
Severity: Convention
Style/LargeNumbers:
Enabled: true
Severity: Convention
IntMinDigits: 5
Style/VariableNames:
Enabled: true
Severity: Warning
# Performance rules
Performance/AnyInsteadOfEmpty:
Enabled: true
Severity: Warning
Performance/SizeAfterFilter:
Enabled: true
Severity: Warning
# .ameba.yml - Strict configuration for production code
Globs:
- "src/**/*.cr"
- "spec/**/*.cr"
- "!lib"
Excluded:
- spec/fixtures/**
- spec/support/mocks/**
# All lint rules enabled as errors
Lint/Syntax:
Enabled: true
Severity: Error
Lint/UnusedArgument:
Enabled: true
Severity: Error
Lint/UselessAssign:
Enabled: true
Severity: Error
Lint/UnreachableCode:
Enabled: true
Severity: Error
Lint/ShadowingOuterLocalVar:
Enabled: true
Severity: Error
Lint/DebuggerStatement:
Enabled: true
Severity: Error
# Style rules as warnings or errors
Style/RedundantReturn:
Enabled: true
Severity: Error
Style/RedundantBegin:
Enabled: true
Severity: Error
Style/LargeNumbers:
Enabled: true
Severity: Error
IntMinDigits: 4
Style/VariableNames:
Enabled: true
Severity: Error
Style/MethodNames:
Enabled: true
Severity: Error
Style/ConstantNames:
Enabled: true
Severity: Error
Style/PredicateName:
Enabled: true
Severity: Warning
# Performance rules as warnings
Performance/AnyInsteadOfEmpty:
Enabled: true
Severity: Warning
Performance/SizeAfterFilter:
Enabled: true
Severity: Warning
Performance/CompactAfterMap:
Enabled: true
Severity: Warning
Performance/FlattenAfterMap:
Enabled: true
Severity: Warning
Use the ameba-configuration skill when:
ameba --gen-config to see all available rules and their defaults.ameba.yml so team members share the same configurationameba locally before committing configuration changesExcluded: ["**/*"] defeats the purpose of static analysisameba:disable comments instead of fixing issues**/*.ecr in Globs for web applicationscrystal tool formatspec/**/*.cr in Globsameba:disable at file level without re-enabling