Claude Code Plugin for Hamilton¶
The Hamilton Claude Code plugin provides AI-powered assistance for developing Hamilton DAGs using Claude Code, Anthropic’s official CLI tool.
What is Claude Code?¶
Claude Code is an AI-powered CLI tool that helps you build software faster by providing intelligent code assistance, debugging help, and code generation capabilities. The Hamilton plugin extends Claude Code with deep knowledge of Hamilton patterns and best practices.
Features¶
The Hamilton Claude Code plugin provides expert assistance for:
🏗️ Creating new Hamilton modules with proper patterns and decorators
🔍 Understanding existing DAGs by explaining dataflow and dependencies
🎨 Applying function modifiers correctly (@parameterize, @config.when, @check_output, etc.)
🐛 Debugging issues in DAG definitions and execution
🔄 Converting Python scripts to Hamilton modules
⚡ Optimizing pipelines with caching, parallelization, and best practices
✅ Writing tests for Hamilton functions
📊 Generating visualizations of your DAGs
Installation¶
Prerequisites¶
First, install Claude Code:
# Install Claude Code CLI
curl -fsSL https://cli.claude.ai/install.sh | sh
For more installation options, see the Claude Code documentation.
Install the Hamilton Plugin¶
Once Claude Code is installed, you can add the Hamilton plugin:
# Add the Hamilton plugin marketplace
/plugin marketplace add apache/hamilton
# Install the plugin (available across all projects)
/plugin install hamilton --scope user
Or combine into a single command:
claude plugin install hamilton@apache/hamilton --scope user
Installation scopes:
--scope user- Available in all your projects (recommended)--scope project- Only in the current project--scope local- Testing/development only
For Contributors¶
If you’ve cloned the Hamilton repository, the skill is already available in .claude/plugins/hamilton/skills/hamilton/ and will be automatically discovered by Claude Code when you work in the repo. No installation needed!
Usage¶
Automatic Assistance¶
Claude Code will automatically use the Hamilton plugin when it detects you’re working with Hamilton code. Just ask questions or give instructions naturally:
claude "Help me create a Hamilton module for processing customer data"
claude "Explain what this DAG does"
claude "Convert this pandas script to Hamilton"
claude "Add caching to my expensive computation function"
claude "Why am I getting a circular dependency error?"
Manual Invocation¶
You can explicitly invoke the skill using the /hamilton command:
claude /hamilton create a feature engineering module with rolling averages
claude /hamilton explain the dataflow in my_functions.py
claude /hamilton optimize this DAG for parallel execution
Interactive Mode¶
For ongoing assistance, start an interactive session:
# Start Claude Code in your Hamilton project
cd /path/to/your/hamilton/project
claude
Then interact naturally:
You: I need to create a DAG that processes customer transactions
Claude: I'll help you create a Hamilton module for processing customer transactions...
You: Add validation to ensure all amounts are positive
Claude: I'll add a @check_output decorator with validation...
Examples¶
Creating a New Hamilton Module¶
Prompt:
Create a Hamilton module that loads sales data from a CSV, removes nulls,
calculates a 7-day rolling average, and outputs the top 10 days by sales.
Claude generates:
"""Sales analysis DAG."""
import pandas as pd
def raw_sales(csv_path: str) -> pd.DataFrame:
"""Load sales data from CSV.
:param csv_path: Path to sales CSV file
:return: Raw sales DataFrame
"""
return pd.read_csv(csv_path)
def cleaned_sales(raw_sales: pd.DataFrame) -> pd.DataFrame:
"""Remove null values from sales data.
:param raw_sales: Raw sales data
:return: Cleaned sales DataFrame
"""
return raw_sales.dropna()
def rolling_avg_7d(cleaned_sales: pd.DataFrame) -> pd.Series:
"""Calculate 7-day rolling average of sales.
:param cleaned_sales: Cleaned sales data
:return: 7-day rolling average
"""
return cleaned_sales['sales'].rolling(window=7, min_periods=1).mean()
def top_10_sales_days(
cleaned_sales: pd.DataFrame,
rolling_avg_7d: pd.Series
) -> pd.DataFrame:
"""Get top 10 days by rolling average.
:param cleaned_sales: Cleaned sales data
:param rolling_avg_7d: 7-day rolling average
:return: Top 10 sales days
"""
result = cleaned_sales.copy()
result['rolling_avg'] = rolling_avg_7d
return result.nlargest(10, 'rolling_avg')
# Usage:
# from hamilton import driver
# dr = driver.Driver({}, __name__)
# results = dr.execute(['top_10_sales_days'], inputs={'csv_path': 'sales.csv'})
Converting Existing Code¶
Prompt:
Convert this script to Hamilton:
import pandas as pd
df = pd.read_csv('data.csv')
df['feature'] = df['col_a'] * 2 + df['col_b']
result = df.groupby('category')['feature'].mean()
Claude refactors to:
"""Data processing DAG."""
import pandas as pd
def raw_data(data_path: str) -> pd.DataFrame:
"""Load raw data from CSV."""
return pd.read_csv(data_path)
def feature(raw_data: pd.DataFrame) -> pd.Series:
"""Calculate feature from columns."""
return raw_data['col_a'] * 2 + raw_data['col_b']
def data_with_feature(raw_data: pd.DataFrame, feature: pd.Series) -> pd.DataFrame:
"""Add feature column to dataset."""
result = raw_data.copy()
result['feature'] = feature
return result
def result(data_with_feature: pd.DataFrame) -> pd.Series:
"""Calculate mean feature by category."""
return data_with_feature.groupby('category')['feature'].mean()
Applying Decorators¶
Prompt:
I need to create rolling averages for 7, 30, and 90 day windows.
How do I do this without repeating code?
Claude suggests:
from hamilton.function_modifiers import parameterize
@parameterize(
rolling_7d={'window': 7},
rolling_30d={'window': 30},
rolling_90d={'window': 90},
)
def rolling_average(sales: pd.Series, window: int) -> pd.Series:
"""Calculate rolling average for different windows.
Creates three nodes: rolling_7d, rolling_30d, rolling_90d
"""
return sales.rolling(window=window, min_periods=1).mean()
Debugging¶
Prompt:
I'm getting: "Could not find parameter 'processed_data' in graph"
Claude analyzes:
This error occurs when a function parameter references a node that doesn't exist
in your DAG. Common causes:
1. Typo in parameter name (e.g., 'processed_data' vs 'process_data')
2. Missing function definition for 'processed_data'
3. Function excluded via @hamilton_exclude or @config.when
Check your module for a function named 'processed_data'. If it doesn't exist,
either:
- Add the function, or
- Fix the parameter name to match an existing function
What the Plugin Knows¶
The plugin has deep knowledge of Hamilton:
Core Concepts¶
Function-based DAG definitions
Driver configuration and execution
Node dependencies via parameters
Type hints and annotations
Function Modifiers¶
Configuration: @config.when, @hamilton_exclude
Parameterization: @parameterize, @parameterize_sources, @parameterize_values
Column extraction: @extract_columns, @extract_fields
Data quality: @check_output, @check_output_custom, @schema
I/O: @save_to, @load_from, @dataloader, @datasaver
Transformation: @pipe, @does, @mutate, @step
Advanced: @subdag, @resolve, @cache
Integration Patterns¶
Airflow orchestration
FastAPI microservices
Streamlit dashboards
Jupyter notebooks
Ray/Dask/Spark distributed execution
LLM Workflows¶
RAG pipeline patterns
Document chunking
Vector database operations
Embedding generation
Best Practices¶
Testing strategies
Code organization
Error handling
Performance optimization
Plugin Structure¶
The plugin is organized as follows:
.claude/plugins/hamilton/
├── .claude-plugin/
│ ├── plugin.json # Plugin manifest
│ └── marketplace.json # Marketplace configuration
├── skills/
│ └── hamilton/
│ ├── SKILL.md # Main skill instructions
│ ├── examples.md # Code examples and patterns
│ └── README.md # Skill documentation
└── README.md # Plugin documentation
For contributors, the skill exists in .claude/plugins/hamilton/skills/hamilton/ for immediate use.
Contributing¶
Found a bug or want to improve the plugin? We’d love your help!
Report Issues¶
Please file an issue with:
Clear description of the problem
Steps to reproduce
Expected vs actual behavior
Hamilton and Claude Code versions
Submit Pull Requests¶
Fork the repository: https://github.com/apache/hamilton
Make changes in
.claude/plugins/hamilton/skills/hamilton/Test thoroughly with various scenarios
Submit a PR with a clear description
Contribution ideas:
📚 Add new examples to
examples.md📝 Improve instructions in
SKILL.md🐛 Fix bugs or inaccuracies
✨ Add support for new Hamilton features
📖 Enhance documentation
See CONTRIBUTING.md for guidelines.
Requirements¶
Claude Code CLI - v0.1.0 or later
Hamilton - v1.0.0 or later (plugin works with any version)
Python - 3.9 or later
Troubleshooting¶
Plugin Not Loading¶
If the plugin isn’t recognized:
# Check installed plugins
claude plugin list
# Reinstall if needed
claude plugin uninstall hamilton
claude plugin install hamilton@apache/hamilton --scope user
Skill Not Activating¶
If Claude doesn’t seem to use Hamilton knowledge:
# Manually invoke the skill
claude /hamilton <your-question>
# Or mention Hamilton explicitly in your prompt
claude "Using Hamilton framework, create a DAG for..."
Permission Errors¶
The plugin requests permission to:
Read files (Read, Grep, Glob)
Run Python code (python, pytest)
Search files (find)
If prompted, approve these permissions for the best experience.
Learn More¶
Hamilton Documentation: https://hamilton.apache.org
Claude Code Documentation: https://code.claude.com/docs
Hamilton GitHub: https://github.com/apache/hamilton
Hamilton Examples: https://github.com/apache/hamilton/tree/main/examples
Community Slack: Join via Hamilton GitHub repo
License¶
This plugin is part of the Apache Hamilton project and is licensed under the Apache 2.0 License.
Enhance your Hamilton development with AI! 🚀