Use when creating custom Ameba rules for Crystal code analysis including rule development, AST traversal, issue reporting, and rule testing.
View on GitHubTheBushidoCollective/han
jutsu-ameba
January 24, 2026
Select agents to install to:
npx add-skill https://github.com/TheBushidoCollective/han/blob/main/jutsu/jutsu-ameba/skills/ameba-custom-rules/SKILL.md -a claude-code --skill ameba-custom-rulesInstallation paths:
.claude/skills/ameba-custom-rules/# Ameba Custom Rules
Create custom linting rules for Ameba to enforce project-specific code quality standards and catch domain-specific code smells in Crystal projects.
## Understanding Custom Rules
Custom Ameba rules allow you to:
- Enforce project-specific coding standards
- Catch domain-specific anti-patterns
- Validate business logic constraints
- Ensure consistency across large codebases
- Create reusable rule libraries for your organization
- Extend Ameba's built-in capabilities
## Rule Anatomy
### Basic Rule Structure
Every Ameba rule inherits from `Ameba::Rule::Base` and follows this structure:
```crystal
module Ameba::Rule::Custom
# Rule that enforces documentation on public classes
class DocumentedClasses < Base
properties do
description "Enforces public classes to be documented"
end
MSG = "Class must be documented with a comment"
def test(source)
AST::NodeVisitor.new self, source
end
def test(source, node : Crystal::ClassDef)
return unless node.visibility.public?
doc = node.doc
issue_for(node, MSG) if doc.nil? || doc.empty?
end
end
end
```
### Key Components
1. **Module namespace** - Custom rules typically use `Ameba::Rule::Custom` or `Ameba::Rule::<Category>`
2. **Base class** - All rules inherit from `Ameba::Rule::Base`
3. **Properties block** - Defines rule metadata and configuration
4. **Message constant** - The error message shown to users
5. **Test method** - Entry point that initializes the AST visitor
6. **Overloaded test methods** - Handle specific AST node types
## Creating Your First Custom Rule
### Step 1: Project Setup
Create a Crystal library for your custom rules:
```bash
# Initialize a new Crystal library
crystal init lib ameba-custom-rules
cd ameba-custom-rules
```
Update `shard.yml`:
```yaml
name: ameba-custom-rules
version: 0.1.0
authors:
- Your Name <your.email@example.com>
description: Custom Ameba rules for your project
crystal: ">= 1.0.0"
licens