Skip to content

Ran a methodical install study on Ruflo v3.6.27 — sharing what surprised me + a few suggestions* #1744

Description

@olsenbrands

Hey Ruflo team,

I've been integrating Ruflo into my own multi-agent runtime and ran into enough "wait, what?" moments that I decided to do a structured install study and write everything down. I'm sending it to you because the product is genuinely impressive and I want to keep using it — but a handful of papercuts kept tripping me up, and I figure you'd want to know which ones bit hardest.

This is friendly feedback, not a bug report dump. If any of it is wrong or already on your roadmap, I'd love to hear that.

What I tested

Latest published version: ruflo 3.6.27.

I tested all three documented install paths from a clean machine state, repeated each in a fresh temp workspace, snapshotted the filesystem before/after, and diffed:

  • npx ruflo@latest init and its 4 flag variants (--minimal, --full, --start-all, init wizard)
  • /plugin marketplace add ruvnet/ruflo + /plugin install ruflo-{core,swarm,autopilot,federation}@ruflo
  • claude mcp add ruflo -- npx ruflo@latest mcp start at all three scopes (user, project, local)

Plus uninstall (ruflo cleanup --force), multi-workspace coexistence (3 parallel installs), and a per-turn cost benchmark via claude -p --output-format json.

Where my expectations didn't match reality

Roughly ranked by how much each tripped me up.

1. Plugin install ≠ npx init (and the README calls it "Recommended")

Going by the README, I expected /plugin install ruflo-core@ruflo (and the three sibling plugins) to give me Ruflo. It doesn't, really:

  • Plugin install creates zero workspace files.
  • It does NOT register the Ruflo MCP server. So memory_store, swarm_init, agent_spawn, etc. are not available to Claude.
  • It doesn't install hooks.
  • Across all 4 plugins combined, I got 9 agents, 7 commands, 12 skills (vs npx init's 98 agents / 60+ commands / 30 skills / full MCP).

Plugin install is a clean lite-mode integration — just slash commands and a few definitions — but it's marketed as the recommended path next to npx init, and they are not equivalent.

Suggestion: Either label them clearly ("Plugin install — slash commands only" vs "CLI install — full Ruflo loop"), or have the plugin trigger the MCP registration too. Right now folks who follow the "Recommended" path will think Ruflo is broken because the tools are missing.

2. npx ruflo init silently appends to ~/.claude/CLAUDE.md

This one I genuinely had to dig to confirm. Every init adds this 4-line block to my user-global Claude rules file:

# Ruflo Integration (auto-generated by ruflo init)
When working on multi-file tasks or complex features, use ToolSearch to find and invoke ruflo MCP tools.
Key tools: memory_store, memory_search, hooks_route, swarm_init, agent_spawn.
Check system-reminder tags for [INTELLIGENCE] pattern suggestions before starting work.

The good news: it's idempotent. I ran init in 3 different workspaces and the block stayed at count = 1. That's a really nice touch and I want to call it out.

The not-so-good news: it's not in the README, the USERGUIDE, or any --help output. A user-global file is a sensitive surface — a one-liner in the install summary like "added a pointer block to ~/.claude/CLAUDE.md so Claude knows about Ruflo's tools globally" would prevent the surprise.

Suggestion: Document it. Maybe even gate it behind a --no-global flag for folks who want to keep their global file pristine.

3. --minimal ships broken hooks

npx ruflo init --minimal writes a .claude/settings.json with 4 hooks declared, all pointing at ${CLAUDE_PROJECT_DIR}/.claude/helpers/hook-handler.cjs. But --minimal doesn't install the helpers directory. So every hook fires and silently fails to find its handler.

Suggestion: Either bundle the helpers in --minimal, or omit the hook declarations entirely. The current state is a footgun for users who picked --minimal to be cautious.

4. README's --wizard flag doesn't exist; init wizard is a subcommand

README says npx ruflo@latest init --wizard. The actual surface is npx ruflo@latest init wizard (no leading dashes — it's a subcommand under init).

Suggestion: One-line README fix.

5. README's MCP add command uses the legacy package name

README:

claude mcp add ruflo -- npx -y @claude-flow/cli@latest

USERGUIDE (the canonical form, verified by ruflo mcp --help):

claude mcp add ruflo -- npx ruflo@latest mcp start

The legacy @claude-flow/cli form does still work, but it's confusing to have two different commands across two docs.

Suggestion: Update README to match USERGUIDE.

6. ruflo cleanup --force is more like "ruflo cleanup --partial"

I expected cleanup --force to remove what init installed. It actually removes only:

  • .claude/helpers/
  • .claude-flow/
  • The hooks block from .claude/settings.json (the file is selectively rewritten, not deleted)

It leaves behind:

  • .claude/agents/ (98 files)
  • .claude/commands/ (60+ files)
  • .claude/skills/ (30 files)
  • .mcp.json (so the MCP server is still registered)
  • The workspace CLAUDE.md
  • The # Ruflo Integration block in ~/.claude/CLAUDE.md

This is fine if you mean "stop the active Ruflo loop without deleting the prompt library" — but the command is named cleanup and the help text says "Remove project artifacts created by claude-flow/ruflo". I expected total removal.

Suggestion: Either offer a cleanup --all / cleanup --everything flag, or rename the current behavior to cleanup --runtime so the partial scope is obvious. Plus document the residue path explicitly.

7. cleanup leaves an orphaned statusLine reference

The selective settings.json rewrite preserves the statusLine block, which still points at .claude/helpers/statusline.cjs — but cleanup just deleted .claude/helpers/. The next claude session in that workspace will hit a missing-file error from the statusline hook.

Suggestion: If cleanup removes helpers, also strip the statusLine reference (or null it out).

8. Per-turn cost is significant and worth being upfront about

I measured a single cold ping (claude -p "Reply with: pong"):

Vanilla workspace After npx init
duration_ms 1670 2073
total_cost_usd $0.21 $0.33
cache_creation_input_tokens 33,592 53,276

Just from init (not even using any Ruflo tools), every turn pays roughly +24% wall, +59% cost, +20K tokens. Over a 100-turn build that's ~$12 / 2M tokens of overhead just for the context-load.

I don't think this is a bug — it's the cost of putting all that orchestration knowledge into context. But it's recurring, not one-time, and it should be in the install docs alongside the disk footprint.

Suggestion: Add a "what this costs you per turn" table to the install docs. Or even surface it post-install: "FYI, you'll see ~$0.10-0.15 per turn of context-load overhead while Ruflo is loaded."

9. --start-all daemon does not auto-terminate

npx ruflo init --start-all spawns a 148 MB daemon that survives the install completing. Stopping it requires npx ruflo daemon stop or manual pkill.

Suggestion: Note this clearly in the install summary. ("Daemon started — PID X. Stop with: ruflo daemon stop.")

10. claude mcp add -s project|local is not cwd-aware (Claude Code limitation, not yours, but worth knowing)

This isn't really a Ruflo issue, but it bit me when scripting installs:

(cd /tmp/some-fresh-workspace && claude mcp add -s project ruflo -- npx ruflo@latest mcp start)

…doesn't write .mcp.json to /tmp/some-fresh-workspace. It writes to whatever Claude Code thinks the current "active project root" is, ignoring my cd. So the canonical npx init (which writes .mcp.json directly) is the only reliable path for programmatic per-workspace install.

If you want to ship a "Install Ruflo into this workspace" Claude Code skill, write .mcp.json directly — don't shell out to claude mcp add.

What worked great (genuinely — credit where due)

  • npx ruflo init Just Works. 2 seconds with a warm npx cache. No prompts. No surprises in exit codes. Idempotent across re-runs. This is the right default.
  • The ~/.claude/CLAUDE.md block is idempotent. Multiple installs don't duplicate. Loved that.
  • Each workspace gets fully independent state (.claude/, .claude-flow/, .swarm/, .mcp.json). No cross-workspace contamination. Two parallel claude sessions in two workspaces get independent MCP server processes.
  • --full flagging the optional MCP servers correctly. flow-nexus is requiresAuth: true and ruv-swarm is optional: true in the generated .mcp.json. That's the right metadata.
  • The wizard UI is clean. Arrow-key menus, sensible defaults, the summary table at the end. Drove it via tmux without trouble.
  • init upgrade --add-missing existing as a documented re-run mode is great — most installers don't think about that.
  • ~/.claude.json is not touched by npx init. This is a really good architectural choice — it means init is immune to Claude Code's ~/.claude.json concurrent-write race that bites a lot of MCP installers. Keep this property.

What I'd love to see (the wish list)

In rough priority order:

  1. README clarity on plugin vs CLI install. This is the single biggest "I thought I had Ruflo and didn't" issue.
  2. Document the ~/.claude/CLAUDE.md mutation + offer --no-global for folks who want to opt out.
  3. Either fix or remove --minimal's broken hooks.
  4. Rename or split cleanup so the partial scope is obvious. Add a cleanup --all.
  5. Per-turn cost callout in the docs — set expectations about recurring overhead.
  6. README docs cleanup--wizardinit wizard, fix the legacy @claude-flow/cli MCP add command.
  7. Daemon lifecycle clarity — install summary should say "daemon running, here's how to stop it".

If you want the full SSOT I built (12 markdown files with verbatim commands, before/after snapshots, diffs, confidence flags), I'm happy to share. Mostly I want to be a useful test case — Ruflo is the most ambitious orchestration layer I've seen on top of Claude Code and I'd like to help it land cleanly for the next wave of folks who try it.

Thanks for shipping it. Genuinely excited to keep building on this.

Cheers

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions