Skip to content

ADR-014's 'One Ruflo' model has no concept of Claude Code plugin installs — 'Your stack' will always undercount for plugin-only users #22

Description

@sparkling

Summary

stack-sync.mjs (which powers the "Your stack" card, ADR-013) only ever scans the global npm library for installed rUv packages. This is not an oversight in the code — it faithfully implements ADR-014 ("The One-Ruflo Reconciliation," Status: Proposed)'s stated target architecture. But that ADR's own model of "how rUv tools reach a machine" has no concept of Claude Code plugins at all, which means any user who installs ruflo/ruvnet-brain/etc. via the Claude Code plugin marketplace (rather than npm install -g) will see a permanently incomplete "Your stack" card, no matter how faithfully ADR-014 gets implemented.

Grounding

docs/adr/0014-one-ruflo-reconciliation.md's North Star:

ONE global Ruflo. A project initializes ONCE, from the global instance, and that init stands up AgentDB with EVERYTHING on... and nothing on the machine fights it.

Target table, L0/L1:

L0 Packages — One global copy per package. Updated by ONE nightly job (stack-sync)... npx never used for rUv packages.
L1 MCP — Every scope launches ruflo MCP from the global binary. Zero npx-launched MCP servers.

The ADR's own "what is actually on the machine" inventory table has rows for Packages, npx producers, Hooks, Memory stores, Learning layers — no row for Claude Code plugins. The document's entire reconciliation is between "one global npm install" vs. "npx shadow copies." A marketplace-installed plugin is a third, structurally different installation path the ADR never models.

stack-sync.mjs:106-119, listInstalled():

function listInstalled() {
  const out = [];
  const scan = (dir, scope = '') => { ... };
  scan(GLOBAL_LIB);   // the ONLY thing ever scanned
  return out.sort(...);
}

Reproduce

On a machine that installs ruflo/ruvnet-brain/etc. purely as Claude Code plugins (no global npm install of the CLI packages at all):

$ npm ls -g --depth=0
├── @metaharness/darwin@0.8.0
├── agentic-qe@3.12.2
└── ... (7 other unrelated global packages — no ruflo, no ruvector, no agentdb)

$ ls ~/.claude/plugins/cache/
ruflo/  ruvnet-brain/  ... (fully installed, actively driving every session's MCP tools)

"Your stack" reports 2 packages (whichever of the 9 real global packages happen to match the FAMILY regex). The user has the full rUv toolkit, actively in use — the card just can't see it, because plugins were never part of what "installed" means in ADR-014's model.

For contrast: a reference screenshot from a machine using the global-npm-install setup style ADR-014 actually targets shows 39 packages including ruflo, RuVector, AgentDB, AI Defence — all genuinely npm install -g'd there. That's not a bug on that machine; it's just a different (and, per ADR-014, the intended) setup style than a plugin-only user has.

Why it matters

The Claude Code plugin marketplace is a first-class, actively-maintained way to distribute ruflo, ruvnet-brain, and the rest of this ecosystem — arguably the lower-friction onboarding path for a new Claude Code user compared to manually npm install -g-ing every CLI. A console whose headline "Your stack" card can only ever see one of these two legitimate paths will systematically undersell itself to exactly the audience most likely to have arrived via the plugin route.

Suggested direction

Not prescribing the fix, but the shape: ADR-014 (or a follow-up ADR, since -014 is still Proposed and gated per-phase) should explicitly add "Claude Code plugin" as a third row in its installation-mechanism inventory, with its own reconciliation story (a plugin has its own version/update cadence via the marketplace, separate from npm semver). stack-sync.mjs's listInstalled() would then also scan ~/.claude/plugins/cache/ (or wherever the active plugin manifest lives) alongside GLOBAL_LIB, reporting plugin-sourced tools distinctly from npm-global ones rather than conflating or ignoring either.

Environment

  • ruvnet-brain v3.3.0
  • ADR referenced: docs/adr/0014-one-ruflo-reconciliation.md (Proposed, 2026-07-14)

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