Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,17 +187,17 @@ When set up with this kit, a two-line footer is appended **below** ruflo's own s

```
▊ RuFlo V3.10.5 ● you │ ⏇ main │ Opus 4.x ┐
🏗️ DDD Domains … 🤖 Swarm … 🔧 Architecture … ├ ruflo's own lines (unchanged)
📊 AgentDB … ┘
──────────────────────────────────────────── ← the kit's appended footer ↓
🧠 SONA [●●●●●] 50 patterns · 55 traj · Δ1.32 LoRA · ⚡ HNSW 🛡 aidefence on
🎓 Agentic QE 🎓 23 patterns · 🧭 114 traj · 🧬 543 vec⚡ · 💾 16MB
🏗️ DDD Domains … 🤖 Swarm … 🔧 Architecture … │ ruflo's own lines + the kit's
📊 AgentDB … │ SONA/aidefence line (all ruflo)
🧠 SONA [●●●●●] 50 patterns · 55 traj · Δ1.32 LoRA · ⚡ HNSW 🛡 aidefence on ┘
───────────────────────────────────────────────────── ← divider (matches ruflo's header rule)
🎓 Agentic QE V3.10.1 🎓 23 patterns · 🧭 114 traj · 🧬 543 vec⚡ · 💾 16MB
```

Every field renders only when its data is actually present (numbers above are illustrative):
- 🧠 **SONA** — `[bar]` is a volume gauge (~10 patterns/dot); `patterns`/`traj` from `.claude-flow/neural/stats.json`; `Δ LoRA` is shown only after you run `ruflo-neural-train` (it caches the transient MicroLoRA delta, which ruflo doesn't persist); `⚡ HNSW` only when a vector index exists.
- 🛡️ **aidefence on** — proactive prompt-injection/PII defense is loaded (ruflo's native line already shows the `CVE n/m` count, so this signals the *other* half).
- 🎓 **Agentic QE** — `🎓 patterns` / `🧭 traj` / `🧬 vec` / `💾 size` from a few guarded `sqlite3` reads of `.agentic-qe/memory.db` (the `vec` count comes from `qe_pattern_embeddings`, falling back to `vectors`/`embeddings` across aqe versions). The branch is already in ruflo's header line, so it's not repeated here.
- 🎓 **Agentic QE** — `V<version>` is the installed `agentic-qe` package version (read from its `package.json`, mirroring `RuFlo V<x>` in ruflo's header); `🎓 patterns` / `🧭 traj` / `🧬 vec` / `💾 size` from a few guarded `sqlite3` reads of `.agentic-qe/memory.db` (the `vec` count comes from `qe_pattern_embeddings`, falling back to `vectors`/`embeddings` across aqe versions). The branch is already in ruflo's header line, so it's not repeated here.

---

Expand Down
23 changes: 19 additions & 4 deletions shell/ruflo-functions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ fs.writeFileSync(f,s);
# Activation footer: append (below ruflo's native render) a two-line footer that
# shows ONLY the features genuinely active in this project:
# 🧠 SONA <patterns> · <traj> [· ⚡ HNSW] 🛡 aidefence on
# 🎓 Agentic QE <patterns> [· <traj>] [· <vec>] · <size>
# 🎓 Agentic QE V<version> <patterns> [· <traj>] [· <vec>] · <size>
# Append-only: never rewrites ruflo's own lines, so it can't break on a ruflo
# template change. self-learning + security are fs-only; the agentic-qe line uses
# one guarded sqlite3 call only when .agentic-qe/memory.db exists. The injector is
Expand Down Expand Up @@ -248,18 +248,33 @@ function rufloActivationSegments(cwd){
if (qtj > 0) qp.push("🧭 " + qtj + " traj");
if (qv > 0) qp.push("🧬 " + qv + " vec" + G + "⚡" + R);
try { var kb = Math.round(fs.statSync(db).size / 1024); qp.push("💾 " + (kb >= 1024 ? (kb/1024).toFixed(1) + "MB" : kb + "KB")); } catch(e){}
qe = Y + "🎓 Agentic QE" + R + " " + (qp.length ? qp.join(DIM + " · " + R) : "on");
// Installed agentic-qe version — shown next to the label, mirroring "RuFlo V<x>"
// in ruflo's native header. Prefer the global install (matches the aidefence
// probe above); fall back to a project-local node_modules copy.
var qver = "";
try {
var qpkg = path.join(path.dirname(process.execPath), "..", "lib", "node_modules", "agentic-qe", "package.json");
if (!fs.existsSync(qpkg)) qpkg = path.join(cwd, "node_modules", "agentic-qe", "package.json");
var qv2 = JSON.parse(fs.readFileSync(qpkg, "utf8")).version;
if (qv2) qver = " V" + qv2;
} catch(e){}
qe = Y + "🎓 Agentic QE" + qver + R + " " + (qp.length ? qp.join(DIM + " · " + R) : "on");
try { fs.mkdirSync(cacheDir, {recursive:true}); fs.writeFileSync(cacheFile, JSON.stringify({ts: Date.now(), line: qe})); } catch(e){}
}
}
} catch(e){}
// ── assemble: line 1 = learning + security; line 2 = agentic-qe ──
// ── assemble: line 1 = learning + security (ruflo features); line 2 = agentic-qe ──
// No rule above the SONA line — SONA + aidefence are ruflo features and sit flush
// under ruflo's native lines. The divider goes BETWEEN the ruflo block and the
// agentic-qe line, matching ruflo's native header divider width ('─'.repeat(53) in
// statusline.cjs) so the two rules line up.
var l1 = []; if (learn) l1.push(learn); if (sec) l1.push(sec);
var out = [];
if (l1.length) out.push(l1.join(" "));
if (out.length && qe) out.push(DIM + "─".repeat(53) + R);
if (qe) out.push(qe);
if (!out.length) return "";
return "\n" + DIM + "─".repeat(44) + R + "\n" + out.join("\n");
return "\n" + out.join("\n");
} catch(e){ return ""; }
}
/* ruflo-seg:END */
Expand Down