* feat(plugins): ADR-509 plugin trust — signing, scan before install, refuse project auto-approve keys - scripts/sign-plugins.mjs signs every marketplace plugin (signature.json: sorted path+sha256 list, version, Ed25519 over canonical JSON) with the existing helpers key (same key resolution as sign-helpers.mjs; never printed). Nothing is signed with the real key here; release step in ADR. - `ruflo plugins verify [name]` and `ruflo mods doctor` check the clone and install cache: verified / modified / unsigned / bad-signature, and write ~/.claude-flow/mods/plugin-verify.json per config dir. - ruflo-mods plugin.register gate: under modTrust refuse-risky, a <name>@ruflo module whose clone is modified or bad-signature is refused (allow-list does not exempt it). Live-validated on Claude Code 2.1.289. - Static scan of .mcp.json, hooks/hooks.json and hook modules before `claude plugin install` (mods install / init mods path) and before a local `plugins install`; a high finding blocks that plugin unless --accept-risk <plugin>, which is recorded in .claude-flow/mods/install.json. - settings-risk-scanner covers enableAllProjectMcpServers, enabledMcpjsonServers, bypassPermissions, blanket Bash/* allows and non-ruflo hooks; `ruflo init` / `init hooks` / `init upgrade --settings` stop before writing anything (--keep-risky-settings / --drop-risky-settings); `ruflo doctor` warns on them in settings.json and settings.local.json. Co-Authored-By: RuFlo <ruv@ruv.net> * docs(adr): ADR-509 status names PR #4593 Co-Authored-By: RuFlo <ruv@ruv.net> * fix(init): ADR-509 classify ruflo hooks by exact command; gate project-shipped helpers isRufloHelperCommand no longer reuses pinToUserHelpers as a classifier: it matches the closed set of commands ruflo generates or has generated (each helper, subcommand, scope, platform, plus the legacy forms) by string equality. node -e with extra code, -r/--require, --import, NODE_OPTIONS= and a helper path in a comment are now findings. A project .claude/helpers/<critical helper> that is neither ruflo's shipped copy nor in a ruflo-signed manifest stops init too; --drop-risky-settings replaces it. Co-Authored-By: RuFlo <ruv@ruv.net> * fix(mods): ADR-509 a scan-blocked plugin is never left enabled applyMods scans an existing marketplace clone before enabling anything and does not enable what it blocks; a plugin the post-refresh scan blocks has its enabledPlugins key removed and is dropped from the install record. The --no-plugin-install, test/CI and no-claude paths are covered by the pre-enable scan, and say when there is no clone to scan yet. Co-Authored-By: RuFlo <ruv@ruv.net> * fix(plugins): ADR-509 scan the modules hooks.json loads and their imports The pre-install scan now resolves hooks.json `modules` against hooks.json and follows every relative import/export-from/import()/require they reach, with none of the walk's name, directory or size skips. A loaded file that is missing, unreadable, over the size limit, outside the plugin, or loads a computed module name is a high finding instead of being skipped. Co-Authored-By: RuFlo <ruv@ruv.net> * fix(mods): ADR-509 signature gate works on Windows and checks the loaded copy The status file key is normalized the same way on both sides (forward slashes, no trailing slash, Windows drive paths lower-cased), and the mod finds the home the CLI used (USERPROFILE on Windows, else HOME). plugins/.gitattributes turns off line-ending conversion so a Windows clone hashes as signed. Every writer now records the install-cache copies too: per plugin the worst of all copies, and each copy by its directory; the mod looks up the plugin.register root first, so a tampered install cache next to a clean clone is refused. Co-Authored-By: RuFlo <ruv@ruv.net> * fix(mods): ADR-509 match status path keys normalized; fix-pass notes The mod compares the status file's per-copy path keys normalized, so a key another writer spelled differently still matches the plugin.register root. ADR-509 gains the review fix-pass implementation notes and live validation. Co-Authored-By: RuFlo <ruv@ruv.net> * fix(mods): ADR-509 report each blocked plugin once per run Co-Authored-By: RuFlo <ruv@ruv.net> * fix(cli): no env values in sign-plugins errors; RSA-2048 in the rejection test (CodeQL, ADR-509) Co-Authored-By: RuFlo <ruv@ruv.net> * chore(ruflo-mods): 0.12.0 for ADR-509 Co-Authored-By: RuFlo <ruv@ruv.net> * test(mods): make mods-cli-bin failures readable (no more opaque STACK_TRACE_ERROR) execFileSync's error holds Buffers and a process handle that vitest cannot serialize, so a CI failure only said STACK_TRACE_ERROR. Rethrow a plain Error with exit status, signal and the child's stdout/stderr tail. Co-Authored-By: RuFlo <ruv@ruv.net> --------- Co-authored-by: r <r@x>
Ruflo Plugins
32 Claude Code plugins for agent-powered development workflows. Load with --plugin-dir.
Quick Start
# Load specific plugins
claude --plugin-dir plugins/ruflo-core --plugin-dir plugins/ruflo-swarm
# Load all plugins
claude $(ls -d plugins/ruflo-*/ | sed 's|^|--plugin-dir |' | tr '\n' ' ')
Plugin Catalog
Core & Coordination
| Plugin | Description |
|---|---|
| ruflo-core | MCP server, status, doctor, coder/researcher/reviewer agents |
| ruflo-swarm | Swarm topologies (hierarchical, mesh), Monitor streaming |
| ruflo-autopilot | Autonomous /loop task completion with prediction |
| ruflo-loop-workers | 12 background workers via /loop or CronCreate |
| ruflo-workflows | Workflow templates, parallel execution, branching |
Memory & Intelligence
| Plugin | Description |
|---|---|
| ruflo-agentdb | AgentDB with HNSW vector search (150x-12,500x faster) |
| ruflo-rag-memory | SOTA RAG — hybrid search, Graph RAG, MMR diversity, memory bridge |
| ruflo-rvf | Portable RVF memory format, session persistence |
| ruflo-ruvector | ruvector — FlashAttention-3, Graph RAG, hybrid search, 103 MCP tools, Brain AGI |
| ruflo-knowledge-graph | Entity extraction, relation mapping, pathfinder traversal |
| ruflo-intelligence | SONA neural patterns, trajectory learning, model routing |
| ruflo-daa | Dynamic Agentic Architecture, cognitive patterns |
Architecture & Methodology
| Plugin | Description |
|---|---|
| ruflo-adr | ADR lifecycle — create, index, supersede, compliance checking |
| ruflo-ddd | DDD scaffolding — bounded contexts, aggregates, domain events |
| ruflo-sparc | SPARC methodology with 5 phases and quality gates |
Quality & Security
| Plugin | Description |
|---|---|
| ruflo-security-audit | CVE scanning, dependency vulnerability checks |
| ruflo-aidefence | Prompt injection detection, PII scanning |
| ruflo-protector | Project Anatole: optional learning watchdog for unattended agents (default off) |
| ruflo-testgen | Test gap detection, TDD London School workflow |
| ruflo-browser | Playwright browser automation and testing |
| agentic-qe-fleet | External (Agentic QE, pinned in the marketplace): QE agents, coverage, chaos, TDD skills, agentic-qe MCP server. Install with /plugin install agentic-qe-fleet@ruflo; not in this folder, so --plugin-dir does not load it. Install it from one marketplace only (agentic-qe or ruflo), not both: enabled from both, its mod and commands load twice |
Development Tools
| Plugin | Description |
|---|---|
| ruflo-jujutsu | Diff analysis, risk scoring, reviewer recommendations |
| ruflo-docs | Doc generation, drift detection, API docs |
| ruflo-ruvllm | Local LLM inference, MicroLoRA, chat formatting |
| ruflo-agent | WASM agent sandboxing and gallery |
| ruflo-plugin-creator | Scaffold and validate new plugins |
| ruflo-migrations | Database schema migration management |
| ruflo-observability | Structured logging, tracing, metrics correlation |
| ruflo-cost-tracker | Token usage tracking, budget alerts, cost optimization |
Domain-Specific
| Plugin | Description |
|---|---|
| ruflo-goals | GOAP planning, deep research, horizon tracking |
| ruflo-federation | Zero-trust cross-installation agent federation |
| ruflo-iot-cognitum | Cognitum Seed IoT — trust scoring, anomaly detection, fleet management |
| ruflo-neural-trader | neural-trader — 4 agents, LSTM/Transformer, Rust/NAPI backtesting, 112+ MCP tools |
| ruflo-market-data | Market data ingestion, OHLCV vectorization, pattern matching |
Recommended Stacks
| Use Case | Plugins |
|---|---|
| Feature development | ruflo-core + ruflo-swarm + ruflo-testgen + ruflo-ddd |
| Security audit | ruflo-core + ruflo-security-audit + ruflo-aidefence |
| Architecture work | ruflo-core + ruflo-adr + ruflo-ddd + ruflo-sparc |
| Deep research | ruflo-core + ruflo-goals + ruflo-rag-memory + ruflo-intelligence |
| Vector search | ruflo-core + ruflo-ruvector + ruflo-rag-memory + ruflo-knowledge-graph |
| IoT development | ruflo-core + ruflo-iot-cognitum + ruflo-agentdb |
| Trading systems | ruflo-core + ruflo-neural-trader + ruflo-market-data + ruflo-ruvector |
| Full stack | All 32 plugins |
npm Package Integration
Several plugins wrap standalone npm packages for deeper functionality:
| Plugin | npm Package | What It Adds |
|---|---|---|
ruflo-neural-trader |
neural-trader |
112+ MCP tools, Rust/NAPI engine, LSTM/Transformer models |
ruflo-ruvector |
ruvector |
103 MCP tools, FlashAttention-3, Graph RAG, Brain AGI |
# Install backing packages
npm install neural-trader ruvector
# Add as MCP servers (optional, for direct tool access)
claude mcp add neural-trader -- npx neural-trader mcp start
claude mcp add ruvector -- npx ruvector mcp start
Plugin Structure
Each plugin follows the Claude Code plugin specification:
ruflo-<name>/
.claude-plugin/plugin.json # Plugin manifest
agents/<name>.md # Agent definitions (frontmatter: name, description, model)
commands/<name>.md # CLI command mappings
skills/<name>/SKILL.md # Interactive skills (frontmatter: name, description, argument-hint, allowed-tools)
README.md # Plugin documentation
Creating a Plugin
claude --plugin-dir plugins/ruflo-plugin-creator
# Then: /create-plugin my-new-plugin
Or manually: copy any existing plugin directory and modify.
Validation
claude plugin validate plugins/ruflo-<name>
Verification & Discoverability
Every MCP tool description across the 32 plugins must answer "use this over native (Bash/Read/Grep/Glob/Task/TodoWrite) when?" per ADR-112. The rule is enforced by CI:
# Run the audit (scans all MCPTool definitions across all plugins)
node scripts/audit-tool-descriptions.mjs
# Gates: every description must include "Use when …" guidance,
# be ≥ 80 chars, and be unique. Baseline at verification/mcp-tool-baseline.json
# is monotone-decreasing — CI fails on any regression.
Combined with verification/ (Ed25519-signed witness manifest, 103+ documented fixes attested), the plugin surface is regression-protected at three layers: install smoke (npm i), behavioral smoke (paired-tool round-trips), and presence attestation (every load-bearing line of every documented fix). See verification/README.md for the full stack.
Per-turn footprint: user-invoked skills and short descriptions
Claude Code keeps the name and description of every skill, command and agent the model can invoke in context on every turn, used or not (ADR-507). Measure it with node scripts/measure-plugin-footprint.mjs (--write saves a report under v3/docs/validation/).
Which skills are user-invoked. A skill gets disable-model-invocation: true in its frontmatter when its job is something a person asks for by name, not something the model should reach for by itself. It still runs as /<plugin>:<skill>; it just leaves the model's listing. The kinds that qualify:
- release, publish and submission flows;
- dashboards, status pages and reports;
- benchmark runners and spend-gated learning or evolution runs;
- one-shot setup and install skills;
- sub-reports that a plugin command already reaches (for example the cost-tracker reports under
/ruflo-cost).
A skill stays model-invoked when the model must find it on its own: memory search, swarm init guidance, safety scans, a gate another agent calls before it starts work (such as cost-budget-check), or anything an agent, command or hook in this repository tells the model to invoke. Before marking a skill, grep plugins/*/agents, plugins/*/commands, plugins/*/skills and plugins/*/hooks for its name: a model blocked by disable-model-invocation is told not to do the skill's work any other way.
Every user-invoked skill is listed under a "User-invoked skills" heading in its plugin README.
Description ceiling. A skill or command description is at most 300 characters: one sentence of what it does and one of when to use it ("Use when …"). node scripts/audit-skill-frontmatter.mjs (CI: all-plugins-smoke) enforces both rules.
License
MIT