R package ecosystem orchestrator for Claude Code β 41 commands, R-aware hooks, validation skills.
Self-contained R package analysis for Claude Code. As of v1.3.0 the plugin is fully self-sufficient β pure-Python lib/ modules handle discovery, dependencies, status, and init. No MCP server required.
- π‘οΈ
r:cran-preptarball-check stage β builds the source tarball withdevtools::build(), inspects it for stray build artifacts (.quarto/,_freeze/,.html,*_files/), then runsrcmdcheck(tarball, --as-cran, --run-donttest). Catches the class of failures CRAN and win-builder see but a source-treedevtools::check()hides. Blocksreadyon errors/warnings/real NOTEs. - πͺ
r:winbuilderfallback β detects when the plugin'slib/is not onPYTHONPATHand falls back todevtools::check_win_*()directly in R, instead of failing silently withModuleNotFoundError. - π§ͺ CLI dogfood + e2e tests β new
tests/cli/automated-tests.shandtests/cli/e2e-tests.shexercise plugin structure and publiclib/modules against fixtures.
- π
r:site --deployleak guard β builds the pkgdown site from a clean named temp-branch worktree so untracked working-directory files never leak into the publishedgh-pagesbranch.r:site --check-leaksscans the render surface for stray files.
Full release history: CHANGELOG.md.
# Quick analysis (< 30 seconds)
/rforge:analyze "Update RMediation bootstrap algorithm"
# Ultra-fast (< 10 seconds)
/rforge:quick
# CRAN submission gate (per-package)
/rforge:r:cran-prep
# Ecosystem rollup (2-5 minutes)
/rforge:thorough "Prepare for CRAN release"β¨ Auto-delegation - Recognizes task patterns, selects appropriate tools
β‘ Parallel execution - Invokes multiple lib/ modules simultaneously
π Live progress - Real-time updates as tools complete
π― Smart synthesis - Combines results into actionable summary
π§ ADHD-friendly - Fast feedback, clear structure, visual progress
π Pure-Python lib/ - lib/discovery.py, lib/deps.py, lib/status.py, lib/init.py, lib/cranlint.py (pure Python, no R); lib/rcmd.py runs R engines for the r:* dev-cycle + CRAN commands. No MCP server, no Node.js. See docs/lib-modules.md.
User Request
β
Pattern Recognition (CODE_CHANGE, BUG_FIX, etc.)
β
Tool Selection (impact, tests, docs, health)
β
Parallel `lib/` invocations (python3 -m lib.* in subprocess)
β
Results Synthesis (impact + quality + maintenance + next steps)
β
Actionable Summary
Balanced analysis with recommendations (< 30 seconds)
/rforge:analyze "Update code"Ultra-fast status check (< 10 seconds)
/rforge:quickComprehensive analysis with R CMD check (2-5 minutes)
/rforge:thorough "Prepare for CRAN"- Python 3.10+ (the
lib/modules run viapython3 -m lib.<tool>) - R Environment
- R >= 4.0.0
- devtools package (optional, for
/rforge:thorough) - testthat package (optional)
- covr package (optional, for coverage analysis)
- Claude Code CLI or Claude Desktop
- Plugin works in both environments
Migrating from v1.2.x? If you have an
mcpServers.rforgeentry in~/.claude/settings.json, you can remove it β v1.3.0 no longer needs the MCP server. Seedocs/migration/rforge-mcp-deprecation.md.
From inside Claude Code:
/plugin marketplace add Data-Wise/rforge
/plugin install rforge
The marketplace install reads .claude-plugin/marketplace.json from the
repository, fetches the plugin into ~/.claude/plugins/rforge, and wires
it up automatically. Works on macOS, Linux, and Windows. Update later with
/plugin update rforge.
# Add the Data-Wise tap
brew tap data-wise/tap
# Install rforge plugin
brew install rforgeThe Homebrew formula automatically:
- Installs the plugin to
~/.claude/plugins/rforge - Makes it available in Claude Code CLI and Claude Desktop
For Claude Code CLI and Claude Desktop:
# Clone the repository
git clone https://github.com/Data-Wise/rforge.git
cd rforge
# Install in development mode (symlink - changes reflected immediately)
ln -s $(pwd) ~/.claude/plugins/rforge
# Or install in production mode (copy - stable)
cp -r . ~/.claude/plugins/rforgeInstallation locations:
- Plugin directory:
~/.claude/plugins/rforge - Commands:
~/.claude/plugins/rforge/commands/ - Agent:
~/.claude/plugins/rforge/agents/orchestrator.md - Lib:
~/.claude/plugins/rforge/lib/
Step 1: Check plugin
# Check plugin directory exists
ls -la ~/.claude/plugins/rforge
# Verify plugin.json
cat ~/.claude/plugins/rforge/.claude-plugin/plugin.jsonStep 2: Check Python
python3 --version # Expect 3.10+Step 3: Test end-to-end
# Navigate to an R package
cd ~/projects/r-packages/active/RMediation
# Start Claude Code
claude
# Test a command
/rforge:statusExpected output:
π RMediation - Single Package
βββββββββββββββββββββββββββββ
Version: 2.4.0
Tests: 187 passing
Health: 87/100 (B+)
After installation, commands are immediately available:
# Navigate to any R package
cd ~/my-r-package
# Start Claude Code
claude
# Use rforge commands
/rforge:analyze "Update bootstrap algorithm"
/rforge:status
/rforge:quickRForge automatically loads when you open Claude Desktop. Commands work the same way:
- Open Claude Desktop app
- Navigate conversation to an R package directory (or specify path)
- Use slash commands:
/rforge:analyze,/rforge:status, etc.
- From v1.2.x: the
mcpServers.rforgeentry in~/.claude/settings.jsonis no longer needed in v1.3.0. Remove it manually (we don't auto-edit user settings). Seedocs/migration/rforge-mcp-deprecation.mdfor the full migration table.
Only relevant if you skipped v1.2.x and are coming from a much older
rforge-orchestratorsetup. v1.3.0 doesn't use any MCP server, so the end state is just: remove these entries entirely.
If your ~/.claude/settings.json has either an rforge-orchestrator or rforge-mcp entry under mcpServers, delete it:
// Delete BOTH of these patterns if present:
{
"mcpServers": {
"rforge-orchestrator": { ... },
"rforge-mcp": { ... }
}
}In v1.3.0+ the plugin runs entirely in-process via lib/ modules β there's no MCP server to configure. The plugin loads via /plugin install rforge; no settings.json entries are required.
For the full transition narrative, see docs/migration/rforge-mcp-deprecation.md.
The orchestrator automatically detects what you're doing:
| Your Request | Pattern | Tools Used |
|---|---|---|
| "Update algorithm" | CODE_CHANGE | impact, tests, docs, health |
| "Add function" | NEW_FUNCTION | detect, tests, docs |
| "Fix bug" | BUG_FIX | tests, impact |
| "Update docs" | DOCUMENTATION | docs, detect |
| "Release 2.1.0" | RELEASE | health, impact, tests, docs |
β‘ Quick analysis running...
β
Done! (8.2 seconds)
π QUICK SUMMARY:
β
Impact: 2 packages (MEDIUM)
β
Tests: 187/187 passing
β οΈ Docs: NEWS.md needs update
β
Health: 87/100 (B+)
π― IMPACT: MEDIUM
β’ 2 packages affected (mediate, sensitivity)
β’ Estimated cascade: 4 hours
β
QUALITY: EXCELLENT
β’ Tests: 187/187 passing (94% coverage)
β’ CRAN: Clean
π MAINTENANCE: 2 items
β’ NEWS.md needs entry
β’ Vignette example outdated
π NEXT STEPS:
1. Implement changes (3 hours)
2. Auto-fix documentation
3. Run cascade for dependents
βββββββββββββββββββββββββββββββββββββββ
β Claude Code Session β
β β
β βββββββββββββββββββββββββββββββββ β
β β RForge Orchestrator Plugin β β
β β β β
β β β’ Pattern Recognition β β
β β β’ Tool Selection β β
β β β’ Parallel Execution β β
β β β’ Progress Display β β
β β β’ Results Synthesis β β
β βββββββββ¬ββββββββββββββββββββββββ β
β β β
ββββββββββββΌβββββββββββββββββββββββββββ
β Parallel python3 -m lib.* calls
β
ββββββββ΄βββββββ¬βββββββ¬βββββββ
β β β β
[discovery] [deps] [status] [init]
β β β β
(8s) (5s) (3s) (7s)
β β β β
βββββββββββββββ΄βββββββ΄βββββββ
β
β
Results synthesized
by orchestrator
| Mode | Tools | Time | Use Case |
|---|---|---|---|
| Quick | 4 quick tools | ~10s | Status check |
| Analyze | 4 quick + synthesis | ~30s | Daily dev |
| Thorough | Background R | 2-5m | Pre-release |
Time savings: Parallel execution = 4x faster than sequential!
- Fast feedback - Results in seconds, not minutes
- Clear structure - Consistent output format
- Visual progress - See what's happening
- Actionable - Always provides next steps
- Interruptible - Can cancel/resume anytime
- Incremental - Results stream as they complete
"python3: command not found"
# Verify Python 3.10+ is on PATH
python3 --version
# macOS: install via Homebrew
brew install python@3.12"Package not detected"
# Run from package directory
cd /path/to/package
# Or specify path explicitly
/rforge:analyze --package /path/to/package"Analysis too slow"
- Use
/rforge:quickfor fast status - Use
/rforge:analyzefor balanced speed/depth - Only use
/rforge:thoroughwhen needed
Plugin settings in plugin.json:
{
"settings": {
"default_mode": "quick", // quick, analyze, or thorough
"parallel_execution": true, // Run tools in parallel
"show_progress": true, // Show progress bars
"auto_synthesize": true // Auto-generate summary
}
}Plugin structure:
~/.claude/plugins/rforge/
βββ .claude-plugin/
β βββ plugin.json # Plugin manifest (v2.8.0)
β βββ marketplace.json # Marketplace install metadata
β βββ config.json # User-tunable options (CRAN mirror, etc.)
β βββ hooks/
β β βββ pretooluse.py # R-aware Write/Edit guard (4 rules)
β βββ skills/
β βββ validation/
β βββ description-sync.md # DESCRIPTION β NEWS.md drift check
βββ commands/ # 33 slash commands (/rforge:*)
βββ agents/
β βββ orchestrator.md # Pattern recognition + delegation
βββ lib/ # Pure-Python analysis modules
β βββ discovery.py # Package detection + ecosystem layout
β βββ deps.py # Dependency graph + impact
β βββ status.py # DESCRIPTION + .STATUS health snapshot
β βββ init.py # ~/.rforge/context.json initializer
β βββ rcmd.py # R dev-cycle + quality + CRAN-submission engines (v2.7.0)
β βββ cranlint.py # CRAN-incoming linter β DESCRIPTION + build-hygiene (v2.3.0)
β βββ formatters.py # Output formatting helpers
βββ docs/ # User-facing docs
Ideas for improvement:
- Add caching for repeated analyses
- Track user preferences for tool selection
- Add more pattern types
- Improve time estimates
- Add result export (markdown, JSON)
MIT
- v1.3.0 absorbed the prior
rforge-mcpprototype (local-only, never published to GitHub or npm). Seedocs/migration/rforge-mcp-deprecation.mdfor the migration narrative. - Claude Code: https://claude.com/code
- Documentation: See
docs/folder
Version: 2.18.0 Status: Active development Compatibility: Claude Code 0.1.0+