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)
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 installsruflo/ruvnet-brain/etc. via the Claude Code plugin marketplace (rather thannpm 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:Target table, L0/L1:
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():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):"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 genuinelynpm 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 manuallynpm 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'slistInstalled()would then also scan~/.claude/plugins/cache/(or wherever the active plugin manifest lives) alongsideGLOBAL_LIB, reporting plugin-sourced tools distinctly from npm-global ones rather than conflating or ignoring either.Environment
docs/adr/0014-one-ruflo-reconciliation.md(Proposed, 2026-07-14)