claude-flow 3.56.1 → 3.56.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ sha256:6141a8ea990c5063b77e090ae8f37f9c539d8aa8f58dcceb30f3a82f97e57319
@@ -0,0 +1,42 @@
1
+ {
2
+ "adoptedAt": 1791580942030,
3
+ "championId": "sha256:6141a8ea990c5063b77e090ae8f37f9c539d8aa8f58dcceb30f3a82f97e57319",
4
+ "manifest": {
5
+ "schema": "ruflo.proven-config/v1",
6
+ "policy": {
7
+ "ref": "sha256:6141a8ea990c5063b77e090ae8f37f9c539d8aa8f58dcceb30f3a82f97e57319",
8
+ "value": {
9
+ "alpha": 0.3,
10
+ "subjectWeight": 1,
11
+ "mmrLambda": 0.5,
12
+ "bodyWeight": 1.5,
13
+ "typePenaltyFactor": 0.5
14
+ }
15
+ },
16
+ "layer": "framework/node-cli",
17
+ "compatibility": {
18
+ "ruflo": ">=3.24.0"
19
+ },
20
+ "benchmark": {
21
+ "corpus": "ADR-081-labelled-v1",
22
+ "corpusHash": "sha256:2f700b5c363e20a3bd88ce2bc9b87bbbbaa61732c6177894c6ec37890f888982"
23
+ },
24
+ "receipt": {
25
+ "heldOutDelta": 0.07381404928570845,
26
+ "redblue": "PASS",
27
+ "drift": 0,
28
+ "canary": {
29
+ "rollbackRate": 0,
30
+ "latencyP95": 244.612458000076,
31
+ "costPerTask": 0
32
+ },
33
+ "receiptCoverage": 1
34
+ },
35
+ "platform": [
36
+ "linux",
37
+ "macOS",
38
+ "windows"
39
+ ]
40
+ },
41
+ "previous": ""
42
+ }
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-flow",
3
- "version": "3.56.1",
3
+ "version": "3.56.3",
4
4
  "workspaces": [
5
5
  "v3/@claude-flow/codex",
6
6
  "v3/@claude-flow/mcp",
@@ -101,7 +101,7 @@
101
101
  "@ruvector/router": "^0.1.31",
102
102
  "@ruvector/router-linux-x64-gnu": "^0.1.31",
103
103
  "@ruvector/sona": "^0.1.5",
104
- "agentdb": "^3.0.0-alpha.17",
104
+ "agentdb": "^3.0.0-alpha.20",
105
105
  "agentic-flow": "^2.0.14",
106
106
  "better-sqlite3": "12.9.0"
107
107
  },
@@ -1,22 +1,85 @@
1
1
  <div align="center">
2
2
 
3
- [![Ruflo Banner](ruflo/assets/ruflo-small.jpeg)](https://cognitum.one/agentic-engineering)
3
+ <a href="https://cognitum.one/agentic-engineering"><img src="ruflo/assets/ruflo-neon-flicker.gif" alt="Ruflo animated neon sign" width="100%"></a>
4
+
5
+ **An agent meta-harness for Claude Code and Codex.**
4
6
 
5
7
  <!-- Try Ruflo — the 3 badges first-time visitors actually act on -->
6
8
  [![npm version (ruflo)](https://img.shields.io/npm/v/ruflo?label=npx%20ruflo&style=for-the-badge&logo=npm&color=cb3837)](https://www.npmjs.com/package/ruflo)
7
9
  [![MIT License](https://img.shields.io/badge/License-MIT-yellow?style=for-the-badge)](https://opensource.org/licenses/MIT)
8
10
  [![Star on GitHub](https://img.shields.io/github/stars/ruvnet/claude-flow?style=for-the-badge&logo=github&color=gold)](https://github.com/ruvnet/claude-flow)
9
11
 
10
- <!-- Ecosystem strip (collapsed visually with flat-square) -->
11
- [![🕸️ RuVector Agentic DB](https://img.shields.io/badge/RuVector_Agentic-DB-06b6d4?style=flat-square&logoColor=white&logo=graphql)](https://github.com/ruvnet/ruvector)
12
- [![Ecosystem downloads](https://img.shields.io/badge/ecosystem%20downloads-8.1M%2B-blue?style=flat-square&logo=npm)](https://github.com/ruvnet/ruflo/blob/main/data/clone-data.proof.json)
13
- [![Git clones (14d)](https://img.shields.io/badge/git%20clones%2014d-106k-blueviolet?style=flat-square&logo=github)](https://github.com/ruvnet/ruflo/blob/main/data/clone-data.ledger.json)
14
- [![Claude Code](https://img.shields.io/badge/Claude%20Code-Plugin-D97757?style=flat-square&logoColor=white&logo=anthropic)](https://github.com/ruvnet/claude-flow)
15
- [![Codex Plugin](https://img.shields.io/badge/Codex-Plugin-412991?style=flat-square&logoColor=white&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI%2BPHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0yMi4yODIgOS44MjFhNS45ODUgNS45ODUgMCAwIDAtLjUxNi00LjkxIDYuMDQ2IDYuMDQ2IDAgMCAwLTYuNTEtMi45QTYuMDY1IDYuMDY1IDAgMCAwIDQuOTgxIDQuMThhNS45ODUgNS45ODUgMCAwIDAtMy45OTggMi45IDYuMDQ2IDYuMDQ2IDAgMCAwIC43NDMgNy4wOTcgNS45OCA1Ljk4IDAgMCAwIC41MSA0LjkxMSA2LjA1MSA2LjA1MSAwIDAgMCA2LjUxNSAyLjlBNS45ODUgNS45ODUgMCAwIDAgMTMuMjYgMjRhNi4wNTYgNi4wNTYgMCAwIDAgNS43NzItNC4yMDYgNS45OSA1Ljk5IDAgMCAwIDMuOTk4LTIuOSA2LjA1NiA2LjA1NiAwIDAgMC0uNzQ3LTcuMDczek0xMy4yNiAyMi40M2E0LjQ3NiA0LjQ3NiAwIDAgMS0yLjg3Ni0xLjA0bC4xNDItLjA4IDQuNzc4LTIuNzU4YS43OTUuNzk1IDAgMCAwIC4zOTMtLjY4MXYtNi43MzdsMi4wMiAxLjE2OGEuMDcxLjA3MSAwIDAgMSAuMDM4LjA1MnY1LjU4M2E0LjUwNCA0LjUwNCAwIDAgMS00LjQ5NSA0LjQ5NHpNMy42IDE4LjMwNGE0LjQ3IDQuNDcgMCAwIDEtLjUzNS0zLjAxNGwuMTQyLjA4NSA0Ljc4MyAyLjc1OWEuNzcxLjc3MSAwIDAgMCAuNzgxIDBsNS44NDMtMy4zNjl2Mi4zMzJhLjA4LjA4IDAgMCAxLS4wMzMuMDYyTDkuNzQgMTkuOTVhNC41IDQuNSAwIDAgMS02LjE0LTEuNjQ2ek0yLjM0IDcuODk2YTQuNDg1IDQuNDg1IDAgMCAxIDIuMzY2LTEuOTczVjExLjZhLjc2Ni43NjYgMCAwIDAgLjM4OC42NzdsNS44MTUgMy4zNTQtMi4wMiAxLjE2OGEuMDc2LjA3NiAwIDAgMS0uMDcyIDBsLTQuODMtMi43ODZBNC41MDQgNC41MDQgMCAwIDEgMi4zNCA3Ljg3MnptMTYuNTk3IDMuODU1LTUuODMzLTMuMzg3IDIuMDE2LTEuMTY1YS4wNzYuMDc2IDAgMCAxIC4wNzEgMGw0LjgzIDIuNzkxYTQuNDk0IDQuNDk0IDAgMCAxLS42NzYgOC4xMDR2LTUuNjc3YS43OS43OSAwIDAgMC0uNDA3LS42Njd6bTIuMDEtMy4wMjMtLjE0MS0uMDg1LTQuNzc0LTIuNzgyYS43NzYuNzc2IDAgMCAwLS43ODUgMEw5LjQwOSA5LjIzVjYuODk3YS4wNjYuMDY2IDAgMCAxIC4wMjgtLjA2Mmw0LjgzLTIuNzg3YTQuNDk5IDQuNDk5IDAgMCAxIDYuNjggNC42NnpNOC4zMDcgMTIuODYzbC0yLjAyLTEuMTY0YS4wOC4wOCAwIDAgMS0uMDM4LS4wNTdWNi4wNzRhNC40OTkgNC40OTkgMCAwIDEgNy4zNzYtMy40NTRsLS4xNDIuMDgtNC43NzggMi43NThhLjc5NS43OTUgMCAwIDAtLjM5My42ODJ6bTEuMDk3LTIuMzY2IDIuNjAyLTEuNSAyLjYwNyAxLjV2Mi45OTlsLTIuNTk3IDEuNS0yLjYwNy0xLjVaIi8%2BPC9zdmc%2B)](https://www.npmjs.com/package/@claude-flow/codex)
12
+ <p align="center">
13
+ <a href="data/npm-downloads.latest.json"><img src="docs/assets/readme/badges/downloads.svg?v=mobile-readable-3" width="300" alt="Ecosystem npm downloads: 12.52M over 12 months through October 4, 2026"></a>
14
+ <br>
15
+ <a href="https://github.com/ruvnet/claude-flow"><img src="docs/assets/readme/badges/claude.svg?v=mobile-readable-3" width="300" alt="Claude Code"></a>
16
+ <a href="https://www.npmjs.com/package/@claude-flow/codex"><img src="docs/assets/readme/badges/codex.svg?v=mobile-readable-3" width="300" alt="Codex Plugin"></a>
17
+ </p>
18
+
19
+ </div>
20
+
21
+ <a id="start-here"></a>
22
+
23
+ ## <img src="docs/assets/readme/icons/terminal.svg" width="32" height="32" alt=""> Get started with Ruflo
24
+
25
+ <img src="docs/assets/readme/icons/plugins.svg" width="28" height="28" alt=""> **Start in Claude Code** with core tools, the visual console and runtime mods. Requires Claude Code **2.1.287 or later**. Run inside Claude Code:
26
+
27
+ ```text
28
+ /plugin marketplace add ruvnet/ruflo
29
+ /plugin install ruflo-core@ruflo
30
+ /plugin install ruflo-console@ruflo
31
+ /plugin install ruflo-mods@ruflo
32
+ /reload-plugins
33
+ /ruflo
34
+ ```
35
+
36
+ **Core** provides foundation tools. **Console** opens the agent cockpit. **Mods** add routing and policy enforcement inside Claude Code. Mods run with your account's permissions; review their code before installing.
37
+
38
+ <img src="docs/assets/readme/icons/terminal.svg" width="28" height="28" alt=""> **Using Codex or another MCP enabled tool?** Use NPX for Ruflo project setup and connect your client to the Ruflo MCP server. Run the setup wizard in your project terminal:
39
+
40
+ ```bash
41
+ npx ruflo@latest init wizard
42
+ ```
43
+
44
+ For clients that support local stdio MCP servers, configure **command** `npx` and **arguments** `["-y", "ruflo@latest", "mcp", "start"]`. The equivalent server command is:
45
+
46
+ ```bash
47
+ npx -y ruflo@latest mcp start
48
+ ```
49
+
50
+ MCP exposes Ruflo tools to your client. The console and mods above are Claude Code integrations; hook support depends on the client.
51
+
52
+ [Compare install paths](#quick-start) · [Open the console](#console-walkthrough) · [User guide](docs/USERGUIDE.md)
53
+
54
+ <div align="center">
55
+
56
+
57
+ ### Optional: ruOS Desktop
58
+
59
+ <a href="https://ruos.cognitum.one"><img src="ruflo/assets/ruos-animated.svg" alt="ruOS — A desktop that runs itself" width="100%"></a>
60
+
61
+ **Connect ruOS to ChatGPT or Claude via MCP:**
62
+
63
+ ```text
64
+ https://ruos.cognitum.one/mcp
65
+ ```
66
+
67
+
68
+
69
+ <!-- RuVector promo -->
70
+ <a href="https://github.com/ruvnet/ruvector"><img src="docs/assets/readme/ruvector-promo-depth.svg" width="100%" alt="RuVector: Give your agents memory. Local vector search, persistent context, graph relationships and feedback learning. Explore RuVector."></a>
71
+
72
+ ```bash
73
+ npx ruvector
74
+ ```
75
+
76
+
77
+
16
78
 
17
79
  # Ruflo
18
80
 
19
- **An agent meta-harness for Claude Code and Codex.**
81
+ [English](README.md) · [简体中文](README.zh-CN.md)
82
+
20
83
 
21
84
  [![RuFlo Explained — build an AI team that plans, remembers, tests, and improves](docs/assets/ruflo-explained/ch14.jpg)](docs/ruflo-explained.md)
22
85
 
@@ -29,13 +92,16 @@ A 14-chapter guide: from the basic idea to a first useful task, then memory, age
29
92
 
30
93
  One `npx ruflo init` gives Claude Code a nervous system: agents self-organize into swarms, learn from every task, remember across sessions, and — with federation — securely talk to agents on other machines without leaking data. You keep writing code. Ruflo handles the coordination.
31
94
 
32
- ```
33
- Self-Learning / Self-Optimizing Agent Architecture
95
+ <p align="center"><img src="docs/assets/readme/learning-cinematic-compact.svg" width="100%" alt="Ruflo trajectory learning: branching memory paths, outcome feedback, contrastive AI and local learning. No LLM required for local vector retrieval and contrastive updates; agent execution may still use an LLM."></p>
34
96
 
35
- User --> Ruflo (CLI/MCP) --> Router --> Swarm --> Agents --> Memory --> LLM Providers
36
- ^ |
37
- +---- Learning Loop <-------+
38
- ```
97
+ <sub>Conceptual learning loop. Local vector retrieval and contrastive updates can run without an LLM; embeddings and configured learning modules are still required. See the <a href="v3/@claude-flow/cli/src/services/ruvector-training.ts">RuVector training integration</a> and <a href="v3/@claude-flow/neural/src/modes/balanced.ts">trajectory contrastive learning</a>.</sub>
98
+
99
+ <details>
100
+ <summary>Architecture in text</summary>
101
+
102
+ User → Ruflo (CLI/MCP) → Router → Swarm → Agents → Memory → LLM providers. Memory feeds useful experience back into routing. This is a conceptual flow, not a live execution trace.
103
+
104
+ </details>
39
105
 
40
106
  > **New to Ruflo?** You don't need to learn 314 MCP tools or 26 CLI commands. After `init`, just use Claude Code normally — the hooks system automatically routes tasks, learns from successful patterns, and coordinates agents in the background.
41
107
 
@@ -48,10 +114,50 @@ User --> Ruflo (CLI/MCP) --> Router --> Swarm --> Agents --> Memory --> LLM Prov
48
114
 
49
115
  ---
50
116
 
51
- ![Ruflo Plugins](./ruflo-plugins.gif)
117
+ <p align="center"><img src="docs/assets/readme/console.svg" alt="Mission control: inspect agent work" width="100%"></p>
118
+
119
+ <p align="center"><img src="docs/assets/ruflo-console-workflows.svg" width="952" height="964" alt="An animated recording of the ruflo console inside Claude Code: the boot (the neon sign and every area checked), then the Workflows page on a sample run: phases and agents with model, tokens and time; drilling from a run into one agent's activity, log and result; search; failure triage; cost; replay and compare; the control tab with a confirm card; and the mission autopilot panel"></p>
120
+
121
+ <img src="docs/assets/readme/console-icon-workflows.svg" width="28" height="28" alt=""> **Your agent cockpit.** Track workflows, agents, models, tokens and cost beside Claude Code. The animation shows startup checks and a **sample workflow**, not a live session.
122
+
123
+ <img src="docs/assets/readme/console-icon-inspect.svg" width="28" height="28" alt=""> **Inspect any run.** Open agent logs and results, search, triage failures, replay and compare. Start with `npx ruflo init`, restart Claude Code, then `/ruflo`. [Full console tour](docs/assets/ruflo-console-walkthrough-wide.gif).
124
+
125
+ <img src="docs/assets/readme/console-icon-control.svg" width="28" height="28" alt=""> **Let Claude drive. You set the limits.** Enable **Settings → Claude control** to navigate and run console actions. Choose `read`, `write`, `manage` or `full`, with `ask` or `auto` approval. The current default is **read + ask**; raising the level is your choice. Actions above your permission level are refused, and network, spending and destructive actions require confirmation even in `auto`. Review the live action log or press **Take back control** to stop Claude control. [Details](v3/docs/adr/ADR-444-claude-controls-the-console.md).
126
+
127
+ <a id="console-walkthrough"></a>
128
+
129
+ ### One task: create a mission with Claude
130
+
131
+ <img src="docs/assets/readme/console-icon-workflows.svg" width="28" height="28" alt=""> **Watch the recorded console session below.** Claude creates a mission, opens the Learning and Security pages, and reports its actions in Overview.
132
+
133
+ 1. **Set the boundary.** Install the console using the commands below, open `/ruflo`, then choose **Settings → Claude control → write + ask**.
134
+ 2. **Give a concrete request.** Try: “Create a mission to add a dark mode toggle. Show me the mission and its status.”
135
+ 3. **Approve creation.** Claude opens Missions and sets the goal. Confirm the pending create action in the console.
136
+ 4. **Verify the result.** Check that Missions contains the goal and Overview records the action. Creating a mission does not mean the feature has been implemented.
137
+ 5. **Keep control.** **Take back control** pauses Claude's console tools. A later call should be refused until you restore control.
138
+
139
+ **What the recording demonstrates:** a real Claude Haiku session with `write + auto`, mission creation, page navigation, a refused swarm stop, and control being taken back. The steps above use `ask` so you approve creation yourself. The separate workflow animation uses sample data; neither is evidence of completed swarm work or memory recall.
140
+
141
+ [Implementation and recorded test findings](v3/docs/adr/ADR-444-claude-controls-the-console.md) · [Reproduction script](plugins/ruflo-console/scripts/e2e-control.sh)
142
+
143
+ <p align="center"><img src="docs/assets/ruflo-console-claude-control.gif" alt="Claude Code with the ruflo console beside it: Claude sets a mission goal, creates the mission and opens the Learning, Security and Overview pages through the console tools; the Claude control dashboard logs each action; swarm-stop is refused because it needs the full level; the person clicks Take back control and the next request is refused"></p>
144
+
145
+
146
+ **Install the mods from the ruflo marketplace** (Claude Code 2.1.287 or later; mods run with your account's permissions and are not sandboxed, so read the code first):
147
+
148
+ ```text
149
+ /plugin marketplace add ruvnet/ruflo
150
+ /plugin install ruflo-console@ruflo
151
+ /plugin install ruflo-mods@ruflo
152
+ /reload-plugins
153
+ ```
154
+
155
+ `ruflo-console` is the cockpit above, `ruflo-mods` routes prompts and enforces policy in-process, `ruflo-swarm` shows the swarm in a pane, and `ruflo-ruos` adds the ruOS status segment. Open `/plugin` to confirm they appear in the active mods line. Inside the console, `/ruflo market` is the Plugin Catalog: every ruflo plugin, mod and skill with what it ships, and buttons to install, enable, disable and update (each asks first).
52
156
 
53
157
  ## Quick Start
54
158
 
159
+ <p align="center"><img src="docs/assets/readme/quick-start.svg" alt="Start building with Ruflo" width="100%"></p>
160
+
55
161
  There are **two different install paths** with very different surface areas. Pick based on what you need (#1744):
56
162
 
57
163
  | | **Claude Code Plugin** | **CLI install (`npx ruflo init`)** |
@@ -162,7 +268,7 @@ This adds slash commands and agent definitions. `ruflo-core` (installed above) d
162
268
 
163
269
  </details>
164
270
 
165
- ### CLI Install
271
+ ### <img src="docs/assets/readme/icons/terminal.svg" width="28" height="28" alt=""> CLI Install
166
272
 
167
273
  **macOS / Linux / WSL / Git-Bash:**
168
274
 
@@ -186,68 +292,50 @@ npm install -g ruflo@latest
186
292
 
187
293
  > 💡 **Windows users:** the `curl ... | bash` form needs a POSIX shell (Git-Bash, WSL, MSYS). The `npx ruflo@latest init wizard` line works natively in PowerShell and cmd. If you hit an `'bash' is not recognized` error, use the `npx` line instead — both end up running the same init flow.
188
294
 
189
- ### MCP Server
295
+ ### <img src="docs/assets/readme/icons/network.svg" width="28" height="28" alt=""> MCP Server
190
296
 
191
297
  ```bash
192
298
  # Add Ruflo as an MCP server in Claude Code
193
299
  claude mcp add claude-flow -- npx ruflo@latest mcp start
194
300
  ```
195
301
 
196
- #### HTTP transport security
302
+ ---
197
303
 
198
- `ruflo mcp start -t http` exposes every registered tool over HTTP (`/rpc`, `/mcp`, `/ws`). The default `stdio` transport is not affected.
304
+ ## What You Get
199
305
 
200
- | Setting | Effect |
201
- |---|---|
202
- | `RUFLO_MCP_HTTP_TOKEN=<token>` | Require `Authorization: Bearer <token>` on every request. Failure is a bare `401`. The token is compared in constant time and is never logged. Prefer this over `--auth-token`, which is visible in `ps`. |
203
- | `--auth-token-file <path>` | Read the token from a file (one line). Takes precedence over the env var. |
204
- | `--auth-token <token>` | Same, on the command line (visible in argv; highest precedence). |
205
- | `RUFLO_MCP_ALLOW_UNAUTHENTICATED_HTTP=1` | Allow an unauthenticated bind to a non-loopback `--host`. Only for a trusted network boundary or an authenticating reverse proxy. |
306
+ <p align="center"><img src="docs/assets/readme/capabilities.svg" alt="Your agent toolkit" width="100%"></p>
206
307
 
207
- A token must be 16-512 printable ASCII characters (no spaces). `GET /health` stays public and returns only `{"status":"ok"}` when a token is set. Tokens are supported for `-t http` only; `-t websocket` rejects one.
308
+ <table>
309
+ <tr><td width="50%"><a href="plugins/ruflo-swarm/README.md"><img src="docs/assets/readme/card-swarm.svg" width="100%" alt="Agent teams"></a></td><td width="50%"><a href="plugins/ruflo-rag-memory/README.md"><img src="docs/assets/readme/card-memory.svg" width="100%" alt="Persistent memory"></a></td></tr>
310
+ <tr><td width="50%"><a href="plugins/ruflo-intelligence/README.md"><img src="docs/assets/readme/card-learning.svg" width="100%" alt="Learning loops"></a></td><td width="50%"><a href="plugins/ruflo-security-audit/README.md"><img src="docs/assets/readme/card-security.svg" width="100%" alt="Security controls"></a></td></tr>
311
+ <tr><td width="50%"><a href="https://ruvnet.github.io/ruflo"><img src="docs/assets/readme/card-plugins.svg" width="100%" alt="Plugin marketplace"></a></td><td width="50%"><a href="plugins/ruflo-ruvllm/README.md"><img src="docs/assets/readme/card-routing.svg" width="100%" alt="Models and routing"></a></td></tr>
312
+ </table>
208
313
 
209
- | `--host` | no token | token set |
210
- |---|---|---|
211
- | `localhost`, `127.0.0.1`, `::1` | starts, **unauthenticated** | starts, token required |
212
- | anything else (`0.0.0.0`, `::`, a LAN IP, `127.0.0.2`, `[::1]`, `LOCALHOST`) | **refuses to start** unless `RUFLO_MCP_ALLOW_UNAUTHENTICATED_HTTP=1` | starts, token required |
314
+ | Capability | Description |
315
+ |------------|-------------|
316
+ | <img src="docs/assets/readme/icons/agents.svg" width="28" height="28" alt=""> **100+ Agents** | Specialized agents for coding, testing, security, docs, architecture |
317
+ | <img src="docs/assets/readme/icons/network.svg" width="28" height="28" alt=""> **Comms Layer** | Zero-trust federation — agents across machines/orgs discover, authenticate, and exchange work securely |
318
+ | <img src="docs/assets/readme/icons/swarm.svg" width="28" height="28" alt=""> **Swarm Coordination** | Hierarchical, mesh, and adaptive topologies with consensus |
319
+ | <img src="docs/assets/readme/icons/learning.svg" width="28" height="28" alt=""> **Self-Learning** | SONA neural patterns, ReasoningBank, trajectory learning |
320
+ | <img src="docs/assets/readme/icons/memory.svg" width="28" height="28" alt=""> **Vector Memory** | HNSW-indexed AgentDB — measured ~1.9x faster at N=20k, ~3.2x–4.7x at N=5k vs brute force (recall@10 ~0.99); ANN wins above the crossover, ties/loses at small N. See [audit](docs/reviews/intelligence-system-audit-2026-05-29.md) + [`scripts/benchmark-intelligence.mjs`](scripts/benchmark-intelligence.mjs) |
321
+ | <img src="docs/assets/readme/icons/workers.svg" width="28" height="28" alt=""> **Background Workers** | 12 auto-triggered workers (audit, optimize, testgaps, etc.) |
322
+ | <img src="docs/assets/readme/icons/plugins.svg" width="28" height="28" alt=""> **Plugin Marketplace** | 33 native Claude Code plugins + 21 npm plugins |
323
+ | <img src="docs/assets/readme/icons/routing.svg" width="28" height="28" alt=""> **Multi-Provider** | Claude, GPT, Gemini, Cohere, Ollama with smart routing |
324
+ | <img src="docs/assets/readme/icons/security.svg" width="28" height="28" alt=""> **Security** | AIDefence, input validation, CVE remediation, path traversal prevention |
325
+ | <img src="docs/assets/readme/icons/federation.svg" width="28" height="28" alt=""> **Agent Federation** | Cross-installation agent collaboration with zero-trust security |
326
+ | <img src="docs/assets/readme/icons/audit.svg" width="28" height="28" alt=""> **[MetaHarness](docs/metaharness-user-guide.md)** | Audit your AI agent setup before you ship. Grade readiness (1-100), scan tool configs for security issues, snapshot the whole project to catch regressions over time, and find templates that match your repo. `ruflo eject` turns a ruflo project into a standalone agent toolkit with its own name. [Full guide](docs/metaharness-user-guide.md). |
213
327
 
214
- Without a token, a loopback server is still unauthenticated: any process on the machine, and any web page that can reach it via DNS rebinding, can call tools. Set `RUFLO_MCP_HTTP_TOKEN` whenever the HTTP transport is used.
328
+ ### <img src="docs/assets/readme/icons/learning.svg" width="28" height="28" alt=""> Learning from experience
215
329
 
216
- **Upgrading:** binding off loopback (for example `--host 0.0.0.0` in Docker) now needs a token or the opt-out above; otherwise the server exits with an error.
330
+ <p align="center"><img src="docs/assets/readme/learning-flow.svg" width="100%" alt="Recall, execute, evaluate, store, adapt and reuse: an illustrative agent learning cycle."></p>
217
331
 
218
- ---
219
-
220
- ## What You Get
221
-
222
- | Capability | Description |
223
- |------------|-------------|
224
- | 🤖 **100+ Agents** | Specialized agents for coding, testing, security, docs, architecture |
225
- | 📡 **Comms Layer** | Zero-trust federation — agents across machines/orgs discover, authenticate, and exchange work securely |
226
- | 🐝 **Swarm Coordination** | Hierarchical, mesh, and adaptive topologies with consensus |
227
- | 🧠 **Self-Learning** | SONA neural patterns, ReasoningBank, trajectory learning |
228
- | 💾 **Vector Memory** | HNSW-indexed AgentDB — measured ~1.9x faster at N=20k, ~3.2x–4.7x at N=5k vs brute force (recall@10 ~0.99); ANN wins above the crossover, ties/loses at small N. See [audit](docs/reviews/intelligence-system-audit-2026-05-29.md) + [`scripts/benchmark-intelligence.mjs`](scripts/benchmark-intelligence.mjs) |
229
- | ⚡ **Background Workers** | 12 auto-triggered workers (audit, optimize, testgaps, etc.) |
230
- | 🧩 **Plugin Marketplace** | 33 native Claude Code plugins + 21 npm plugins |
231
- | 🔌 **Multi-Provider** | Claude, GPT, Gemini, Cohere, Ollama with smart routing |
232
- | 🛡️ **Security** | AIDefence, input validation, CVE remediation, path traversal prevention |
233
- | 🌐 **Agent Federation** | Cross-installation agent collaboration with zero-trust security |
234
- | 🔬 **[MetaHarness](docs/metaharness-user-guide.md)** | Audit your AI agent setup before you ship. Grade readiness (1-100), scan tool configs for security issues, snapshot the whole project to catch regressions over time, and find templates that match your repo. `ruflo eject` turns a ruflo project into a standalone agent toolkit with its own name. [Full guide](docs/metaharness-user-guide.md). |
332
+ Useful trajectories and task feedback can inform future work. Results depend on the configured memory, learning components and quality of feedback. [Learning plugin](plugins/ruflo-intelligence/README.md).
235
333
 
236
334
  ### Agent Federation — Slack for Agents
237
335
 
238
- ```
239
- Your Agent --> [ Remove secrets ] --> [ Sign message ] --> [ Encrypted channel ]
240
- Emails, SSNs, Proves it came No one reads it
241
- keys stripped from you in transit
242
- |
243
- v
244
- Their Agent <-- [ Block attacks ] <-- [ Check identity ] <------+
245
- Stops prompt Rejects forgeries
246
- injection
247
-
248
- Audit trail on both sides.
249
- Trust builds over time. Bad behavior = instant downgrade.
250
- ```
336
+ <p align="center"><img src="docs/assets/readme/federation.svg" alt="Connected intelligence across machines" width="100%"></p>
337
+
338
+ <p align="center"><img src="docs/assets/readme/federation-flow.svg" width="100%" alt="Outbound agent, data filtering, signing and encryption, identity verification, input checks and receiving agent."></p>
251
339
 
252
340
  Slack gave teams channels. Federation gives agents the same thing — **shared workspaces across trust boundaries**, where agents on different machines, orgs, or cloud regions can discover each other, prove who they are, and collaborate on tasks.
253
341
 
@@ -349,6 +437,8 @@ User --> Claude Code / CLI
349
437
 
350
438
  ## Documentation
351
439
 
440
+ <p align="center"><img src="docs/assets/readme/documentation.svg" alt="Guides, architecture and verification" width="100%"></p>
441
+
352
442
  Four docs for four audiences:
353
443
 
354
444
  | Doc | When to read it |
@@ -379,6 +469,8 @@ User Guide section index:
379
469
 
380
470
  ## Support
381
471
 
472
+ <p align="center"><img src="docs/assets/readme/support.svg" alt="Build with the Ruflo community" width="100%"></p>
473
+
382
474
  | Resource | Link |
383
475
  |----------|------|
384
476
  | Documentation | [User Guide](docs/USERGUIDE.md) |
@@ -387,6 +479,10 @@ User Guide section index:
387
479
  | Community | [Agentics Foundation Discord](https://discord.com/invite/dfxmpwkG2D) |
388
480
  | Powered by | [Cognitum.one](https://cognitum.one) |
389
481
 
482
+ <p align="center"><img src="docs/assets/readme/signal-divider.svg" alt="Ruflo" width="100%"></p>
483
+
390
484
  ## License
391
485
 
392
486
  MIT - [RuvNet](https://github.com/ruvnet)
487
+
488
+ <a href="https://cognitum.one"><img src="docs/assets/readme/cognitum-banner-v2.svg" width="100%" alt="Cognitum One: Ambient Intelligence at the edge of the Physical World. Explore cognitum.one."></a>
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generation": 6,
4
- "generatedAt": "2026-09-17T21:28:47.530Z",
5
- "gitSha": "702d1461",
3
+ "generation": 7,
4
+ "generatedAt": "2026-10-09T21:52:00.476Z",
5
+ "gitSha": "8c60c8c7",
6
6
  "catalog": {
7
- "agents": 167,
8
- "tools": 418,
7
+ "agents": 176,
8
+ "tools": 423,
9
9
  "skills": 34
10
10
  },
11
11
  "benchmark": null
@@ -2600,8 +2600,12 @@ export const hooksSessionEnd = {
2600
2600
  try {
2601
2601
  await bridge?.shutdownBridge();
2602
2602
  }
2603
- catch {
2604
- // Cleanup is best-effort and must not fail session-end.
2603
+ catch (err) {
2604
+ // Cleanup is best-effort and must not fail session-end, but a failed
2605
+ // AgentDB persist (lock/concurrent writer) is never silent.
2606
+ if (err?.code === 'AGENTDB_LOCK_UNRECOVERABLE') {
2607
+ process.stderr.write(`[ruflo] warning: ${err.message}\n`);
2608
+ }
2605
2609
  }
2606
2610
  }
2607
2611
  return {
@@ -4,5 +4,10 @@
4
4
  * Tool definitions for task management with file persistence.
5
5
  */
6
6
  import { type MCPTool } from './types.js';
7
+ export declare const TASK_STATUSES: readonly ["pending", "in_progress", "completed", "failed", "cancelled"];
8
+ type TaskStatus = (typeof TASK_STATUSES)[number];
9
+ /** The canonical status for a written one (trimmed, any case, known aliases), or null when it is none of the five. */
10
+ export declare function statusOf(value: unknown): TaskStatus | null;
7
11
  export declare const taskTools: MCPTool[];
12
+ export {};
8
13
  //# sourceMappingURL=task-tools.d.ts.map
@@ -12,6 +12,21 @@ import { validateIdentifier, validateText } from './validate-input.js';
12
12
  const STORAGE_DIR = '.claude-flow';
13
13
  const TASK_DIR = 'tasks';
14
14
  const TASK_FILE = 'store.json';
15
+ export const TASK_STATUSES = ['pending', 'in_progress', 'completed', 'failed', 'cancelled'];
16
+ // Spellings agents write for the same five states (seen in the wild: "complete").
17
+ const STATUS_ALIASES = {
18
+ complete: 'completed', done: 'completed', canceled: 'cancelled',
19
+ running: 'in_progress', 'in-progress': 'in_progress', inprogress: 'in_progress',
20
+ };
21
+ /** The canonical status for a written one (trimmed, any case, known aliases), or null when it is none of the five. */
22
+ export function statusOf(value) {
23
+ if (typeof value !== 'string')
24
+ return null;
25
+ const key = value.trim().toLowerCase();
26
+ if (TASK_STATUSES.includes(key))
27
+ return key;
28
+ return Object.hasOwn(STATUS_ALIASES, key) ? STATUS_ALIASES[key] : null;
29
+ }
15
30
  function getTaskDir() {
16
31
  return join(getProjectCwd(), STORAGE_DIR, TASK_DIR);
17
32
  }
@@ -290,7 +305,9 @@ export const taskTools = [
290
305
  type: 'object',
291
306
  properties: {
292
307
  taskId: { type: 'string', description: 'Task ID' },
293
- status: { type: 'string', description: 'New status' },
308
+ // No schema enum: the HTTP/WebSocket registry validates enums before the handler, which would refuse the aliases there
309
+ // while stdio accepted them. The handler is the one place that normalises and refuses, for every transport.
310
+ status: { type: 'string', description: 'New status: pending, in_progress, completed, failed or cancelled' },
294
311
  progress: { type: 'number', description: 'Progress percentage (0-100)' },
295
312
  assignTo: { type: 'array', items: { type: 'string' }, description: 'Agent IDs to assign' },
296
313
  result: { type: 'object', description: 'Result data (e.g. the failure of a failed task)' },
@@ -302,26 +319,52 @@ export const taskTools = [
302
319
  const vId = validateIdentifier(input.taskId, 'taskId');
303
320
  if (!vId.valid)
304
321
  return { success: false, error: vId.error };
322
+ // A status outside the five is stored as written otherwise, and every reader that buckets
323
+ // by status (task_list filters, the console kanban) then miscounts it: "complete" read as pending.
324
+ const status = input.status === undefined ? undefined : statusOf(input.status);
325
+ if (status === null) {
326
+ return { success: false, error: `status must be one of ${TASK_STATUSES.join(', ')}` };
327
+ }
305
328
  const store = loadTaskStore();
306
329
  const taskId = input.taskId;
307
330
  const task = store.tasks[taskId];
308
331
  if (task) {
309
- if (input.status) {
310
- const newStatus = input.status;
332
+ // Worker effects run AFTER the task store is saved, as task_complete does: a failed save must not leave
333
+ // workers freed and counted against a task that still reads unfinished.
334
+ let afterSave;
335
+ if (status !== undefined) {
336
+ const newStatus = status;
337
+ const wasCompleted = task.status === 'completed';
311
338
  task.status = newStatus;
312
339
  if (newStatus === 'in_progress' && !task.startedAt) {
313
340
  task.startedAt = new Date().toISOString();
314
341
  }
315
- // A failed task frees its workers, as task_complete and task_cancel do;
316
- // otherwise a worker whose run failed stays `busy` forever.
317
- if (newStatus === 'failed') {
342
+ // A finished task frees its workers, as task_complete and task_cancel do; otherwise a worker
343
+ // whose task was finished through task_update stays `busy` forever, and a later task_complete
344
+ // returns early because the status already reads completed.
345
+ if (newStatus === 'failed' || newStatus === 'cancelled') {
346
+ task.completedAt = new Date().toISOString();
347
+ afterSave = () => releaseAgents(task.assignedTo, taskId);
348
+ }
349
+ if (newStatus === 'completed' && !wasCompleted) {
318
350
  task.completedAt = new Date().toISOString();
319
- releaseAgents(task.assignedTo, taskId);
351
+ // Credited only to a worker still holding this task, so complete -> pending -> complete
352
+ // (no reassignment in between) never counts the same work twice.
353
+ afterSave = () => updateAgents(task.assignedTo, (agent) => {
354
+ if (agent.currentTask === taskId) {
355
+ agent.status = 'idle';
356
+ agent.currentTask = null;
357
+ agent.taskCount = (agent.taskCount || 0) + 1;
358
+ }
359
+ });
320
360
  }
321
361
  }
322
362
  if (typeof input.progress === 'number') {
323
363
  task.progress = Math.min(100, Math.max(0, input.progress));
324
364
  }
365
+ // Completing is 100% whatever progress the same call carried.
366
+ if (task.status === 'completed')
367
+ task.progress = 100;
325
368
  if (input.assignTo) {
326
369
  task.assignedTo = input.assignTo;
327
370
  }
@@ -329,6 +372,7 @@ export const taskTools = [
329
372
  task.result = input.result;
330
373
  }
331
374
  saveTaskStore(store);
375
+ afterSave?.();
332
376
  return {
333
377
  success: true,
334
378
  taskId: task.taskId,
@@ -2087,16 +2087,25 @@ export function shutdownBridge() {
2087
2087
  if (activeOperations > 0)
2088
2088
  await new Promise(resolve => { drained = resolve; });
2089
2089
  await Promise.allSettled([...registryPromises.values()]);
2090
+ // A failed PERSIST (AGENTDB_LOCK_UNRECOVERABLE: live lock or concurrent
2091
+ // writer on a sql.js database) means pending changes were not saved. That
2092
+ // is surfaced after cleanup completes; other close errors stay best-effort.
2093
+ let persistFailure;
2090
2094
  for (const registry of new Set(registryInstances.values())) {
2091
2095
  try {
2092
2096
  await registry.shutdown();
2093
2097
  }
2094
- catch { /* best-effort cleanup */ }
2098
+ catch (err) {
2099
+ if (err?.code === 'AGENTDB_LOCK_UNRECOVERABLE')
2100
+ persistFailure ??= err;
2101
+ }
2095
2102
  }
2096
2103
  registryInstances.clear();
2097
2104
  registryPromises.clear();
2098
2105
  testRegistryOverride = null;
2099
2106
  bridgeFailureReasons.clear();
2107
+ if (persistFailure)
2108
+ throw persistFailure;
2100
2109
  })().finally(() => { shutdownPromise = null; });
2101
2110
  return shutdownPromise;
2102
2111
  }