- tui: the page bar was painted from session.state.view, which the AI page never sets, so on page 6 it kept the previous page lit; it now follows session.page (9 tests, 4 failed first)
- tui --help and the console README said keys 1-5; they are 1-6 and o c s e m a (test holds the help text)
- cli: policyTrustRoot() no longer joins an empty or relative $HOME, which put the anchor mirror and key under the working directory; falls back to the account home or refuses (2 tests, 1 failed first)
- docs: ruflo-tui-walkthrough.svg re-recorded from real frames with the AI page and its ask-first card, 6 AI marked
Co-Authored-By: RuFlo <ruv@ruv.net>
- boot log + self-check area + help guide for the themes view; nav test lists it as by-name
- bump console to 0.43.0 (plugin.json UTF-8 restored, CHANGELOG, version.ts, smoke pin)
- remove render-theme-demo.py (repo rule: no Python); README points at frames.json
- generate-console-theme skill: allowed-tools: Read
- split pane icons and startup loads out of pane.ts/controller.ts (both back under 500 lines)
Co-Authored-By: RuFlo <ruv@ruv.net>
Page 6. Reuses harness.send and the conversation bridge's sendTo, not a second harness. Host.spawn runs only the pinned Codex 0.162.0
release (never current or PATH), read-only, from a fixed argument allow-list; Host.httpSend sends only https POST to openrouter.ai or a
convoTargets host, never follows a redirect, and a key is read by variable name and never drawn. Enter shows a card of exactly what would be
sent; a lone y answers it only while it was drawn in full (#3983); spend cap from the provider-reported cost. e2e host matrix gets a tui leg
(keyless in CI, live gated). Not in this PR: the workspace-write toggle.
Co-Authored-By: RuFlo <ruv@ruv.net>
Five pages (Overview, Cost, Swarm, Events, Missions) with keys 1-5 / o c s e m / Tab / Shift-Tab, a page bar, a key line that
shortens with the width, clear-and-redraw on resize, a position bar under 60 columns and a notice under 40. Room is left out on
purpose (a message box and Claude sessions this host does not have).
state.isStandalone is the capability flag: on this host the shared chrome is not drawn (no tab bar, footer buttons, Launch,
Ask Claude, Claude control card); a button nobody can press is not drawn, a state chip and a section title are. Missions reads
the ADR-406 record only. Under Claude Code nothing changes. Console 0.42.7.
Co-Authored-By: RuFlo <ruv@ruv.net>
- E: `ruflo tui --plain` prints one plain frame and exits 0; without a TTY and
without --plain it prints a one-line hint on stderr and exits 2 (no frame).
Tests for terminal, non-terminal, --plain in a terminal, no raw mode, and
through the command with the real bundle.
- A: esbuild is a declared root devDependency (^0.27.2, already locked).
- B: v3/@claude-flow/cli/scripts/prepare-publish.mjs builds and stages
plugins/ruflo-console/dist/tui.mjs so a registry install runs `ruflo tui`.
Measured: +449,345 bytes on the CLI tarball.
- ADR-489: status Accepted; section 8 records decisions A-E (C: Swarm, Events,
Missions, Room; D: Codex read-only by default, no danger-full-access, OpenRouter
https-only to openrouter.ai + convoTargets hosts). Repairs a corrupted table row
that had pasted copies of the file head into the ADR.
- README: a short ruflo tui section.
Co-Authored-By: RuFlo <ruv@ruv.net>
- Sessions list starts folded; jumping from the queue opens it.
- First reads past a pass's byte budget wait for the next pass ("not read yet").
- A Codex sub-agent rollout's trailing parent session_meta is lineage, not a second identity.
- ADR/CHANGELOG/README say discovery spawns nothing; the only write is the four-count summary.
Co-Authored-By: RuFlo <ruv@ruv.net>
Needs-you queue (approvals, questions, failures, finished-unread) across Claude Code, Codex and Ruflo
sessions, a browser grouped by repository and worktree, and a preview of the selected session. Local,
read-only discovery (no model call, no process); ambiguous identity goes to an unassigned bucket;
finished work clears only after its preview was drawn; transcript text never reaches a model, the
state, the disk or a text answer. ruflo-mods gains an optional counts-only attention row.
Co-Authored-By: RuFlo <ruv@ruv.net>
One dependency-free policy (canonical in ruflo-mods, byte-identical copies in console,
swarm and protector, checked by scripts/sync-toast-policy.mjs and each smoke.sh): level
prefixes, one washed line of at most 120 characters, 60 s de-duplication, four toasts a
minute per source with errors held and counted, the person's all/important/off setting and
per-source mute (console Settings, mirrored to a file the others read), and a digest of
every toast kept for the console's Events page. All call sites migrated; new toasts for a
mission that finishes or fails and a swarm subagent that fails or a loop that is stuck.
Versions: console 0.37.0, swarm 0.3.4, protector 0.1.1, mods 0.3.16.
Co-Authored-By: RuFlo <ruv@ruv.net>
The console half of Project Anatole (ADR-453; the ruflo-protector plugin is on main, default off). A collapsible section on the Security &
Doctor page, in labelled blocks:
- Status: mode, a baseline maturity bar, open alerts by severity, blocked count, degraded, and a line saying the data is reported by the
mod and unauthenticated;
- Rules: the 13 rules as an aligned table with their OWASP refs, an off/notify/block chip each, hits and acked share (from the last 200
alerts), "changed from default" and "auto-demoted";
- Actions: run (scan the Claude configuration) and replay (what would have fired), results in the page's Result panel;
- Mode: off/learn/notify/enforce with a sentence on what the current mode does, and reset baseline;
- Open alerts: two lines each, with ack and allow buttons; the Findings meter also counts them, labelled as the mod's report.
Reading is bounded and regular-file-only, every field is whitelisted and cleaned (a hostile file cannot break the page), and rule ids,
fingerprints and alert ids are matched against tight patterns before they can reach a command. Every change goes through the confirm
gate: a mode, rule, ack or allow change is a write; switching to enforce is declared install-class and reset-baseline delete-class, so
Claude's own console tools always wait for the person on them. With the plugin never reported, the section is one install line.
Co-Authored-By: RuFlo <ruv@ruv.net>
Registers a directory marketplace and installs the named plugin inside the isolated config only, so the Settings view's plugin option rows can be driven live. The real plugins and settings are never touched.
Co-Authored-By: RuFlo <ruv@ruv.net>