Commit Graph
1008 Commits
Author SHA1 Message Date
randRuFlo a457cbf4dc fix(plugins): clean claude.ai plugin-validator findings (nested manifest, unknown keys, XML tags in skill descriptions)
- ruflo-plugin-creator 0.4.2: mod template manifest is plugin.json.tmpl (no nested plugin); scripts/scaffold-mod.mjs + test-scaffold-mod.mjs validate and test a scaffolded mod
- ruflo-workflows 0.6.5 / ruflo-arena 0.2.4 / ruflo-graph-intelligence 0.2.0-alpha.5: drop unused components / categories keys
- ruflo-metaharness 0.2.5: seven harness-* descriptions use {braces}, not angle brackets
- ruflo-ai-team 0.2.3 (+directory 0.1.1) / ruflo-x-gateway 0.9.5 (+directory 0.8.2): documentationUrl points at main, not the feat branch; store-listing keys kept (the directory reads them)
- scripts/check-plugin-manifests.mjs wired into all-plugins-smoke

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 10:18:04 -04:00
randRuFlo ba810a05fb fix(console): approvals badge counts only rows with an approve/deny action (0.40.3, #3920)
A refused mod or a permission deny has no action, so it held 'n to approve' up
with nothing to press. The band, menu badge, change notices and the Approvals
header now count waitingApprovalsOf(); notices stay listed, named apart.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 22:54:19 -04:00
3991f40670 fix(console): card-bound confirm, one model-facing sanitiser, linear escape stripping, own-key lookups, wrapped Approvals (0.40.2)
- A Yes runs only the card it was pressed on: every pending card has an id,
  the Yes / Always allow / Always accept buttons carry it, runner.confirm(seen)
  runs nothing (and says so) when another card took its place. A card Claude
  raised is re-checked against the level and Stop when it lands and when the
  Yes arrives.
- Everything returned to the model goes through modelLine (escapes, then
  control and invisible characters removed, cut, withheld whole when it holds
  a secret shape or an invite code) and every answer leaves through
  modelLines; a version such as v2.1.0-beta.3 is not an invite.
- ESCAPES is linear: an unterminated OSC ends at the next introducer or the
  end of the text (7.7 s on the old pattern became milliseconds on 1 MB).
- Mission state/status, hive role, audit severity and Settings plugin names
  that are Object.prototype keys read as unknown (own()).
- Approvals and a mission objective wrap at 80 columns instead of being cut
  with an ellipsis (#3899).

Specs ported from #3820, #3821 and #3822, adapted to main.

Co-authored-by: Dragan Spiridonov <spiridonovdragan@gmail.com>
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 17:38:02 -04:00
randRuFlo 3b58ab7de7 feat(ruflo-cost-tracker): 0.28.0, flag Grok list prices approximate
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 16:54:14 -04:00
randRuFlo e2575090c8 chore(plugins): ruflo-ddd and ruflo-sparc 0.3.4 changelog entries for native Codex hooks
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 16:53:35 -04:00
Stuart Kerr 24a83b3297 fix(plugins): allow native freeform inputs and version Codex hook repair 2026-10-08 16:52:49 -04:00
Mathew Beane 0e098e9307 feat(ruflo-cost-tracker): add Grok usage.json reader to cost-ledger
Read ~/.grok/sessions/<urlencoded-cwd>/<id>/usage.json (GROK_HOME override)
into the multi-provider ledger alongside Claude and Codex. One row per turn
when turns[] is present, else session totals; cached input treated as a subset
of inputTokens. Add grok-4.7-build / grok-4.6-build / grok-4.7 / grok-4.6 and
family fallback prices from docs.x.ai (Build Fast rates marked approx).
2026-10-08 16:52:42 -04:00
Stuart Kerr b968e34970 fix(plugins): add native Codex adapters for ADR DDD and SPARC mods 2026-10-08 16:52:42 -04:00
ruv 56a638190d fix(console): CLI launcher resolution and cold-start handling for settings writes (fixes #3914)
With the ruflo CLI option on npx, a confirmed action ran a cold online npx under the 90 s default and aborted with 'still running after 90000ms'. Resolve ruflo on PATH, a project-local bin or the cached npx copy first; give a cold download a 300 s limit and a first-run label; turn a timeout or ENOTCACHED into an error naming the fix. Console 0.40.1; ADR-407 update.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 15:25:08 -04:00
ruv aeaa51e99a feat(console): advisor checkpoints for mission loops (ADR-483)
Default-off Settings rows: a read-only claude -p consult (asked first, exact argv, turn budget, mission spend cap) before a plan locks, when the same check fails twice in a row, and before done; a third failure pauses the mission. Honest about not being the in-session advisor tool. Console 0.40.0.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 12:20:26 -04:00
ruv 817dcfe0e3 fix(console): manually entered text is never silently truncated (ADR-481)
The mission goal was cut at 500 characters and drawn on one clipped line; the host Input is one line and hides the rest. A live mirror
under every field shows all lines, views draw text in full with an explicit marker, limits are checked before sending with the exact
count, and every silent slice/plain cap on typed text is removed or made a counted refusal. console 0.39.1.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 18:20:32 -04:00
ruv 2a08b54a4c Merge origin/main into fix/console-input-truncation
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 18:14:01 -04:00
ruv dd180a29ed test: stronger wrap checks 2026-10-07 18:10:29 -04:00
ruv 7483d28f3c test(console): full-text helpers and input classes (ADR-481)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 18:09:56 -04:00
ruv 5d3d145ac9 wip(console): inputs never cut: chokepoints raised, refusals counted (ADR-481)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 18:02:19 -04:00
ruv bf67d3e304 wip(console): full-text helpers, mission goal never truncated (ADR-481)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 17:44:12 -04:00
ruv b62b7d334c fix(console): keep the swarm ADR digest true to the active mission; verify's confirm names its git reads; real-pane ADRs test (ADR-480)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 17:16:11 -04:00
ruv aed428c43e feat(console,adr): ADR management registry, page and mission/loop/swarm integration (ADR-480)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 17:08:41 -04:00
ruv 578a1d3686 wip(console,swarm): ADR registry, page, mission/swarm integration (ADR-480)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 16:54:03 -04:00
ruv 7670a02849 docs(plugins): CHANGELOG.md for every plugin in the ADR-478 format, derived from git history
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 14:37:29 -04:00
ruv 9cef4cb070 feat(console): What's new page under TOOLS, plugin changelog parser and marker (ADR-478), console 0.38.0
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 14:37:28 -04:00
rUv 2ab3f99ff9 Merge pull request #3890 from ruvnet/release/3.55.0
release: 3.55.0
2026-10-07 10:31:41 -07:00
ruv b02e2247dc chore(release): 3.55.0 versions, leaf pins, lockfiles, plugin bumps, changelog
Pins mcp 3.1.0, plugin-agent-federation 1.0.1, security 3.0.2, shared 3.0.2 and
memory 3.0.1 (all published and registry-verified) in root, cli, pnpm and npm locks.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 13:14:22 -04:00
ruv 04ff98bb32 fix(mods): a toast needs no engine.create (bind at session.start too), a throwing clock falls back to the wall clock; update the cost ladder expectation in the v3 mods contract
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 13:08:53 -04:00
ruv 24806b7e78 fix(mods): console toasts release held errors on a timer; settings section names toasts; ADR wording
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 12:54:37 -04:00
ruv 146febd999 feat(mods): shared toast system with levels, dedupe, persistence and Settings (ADR-477)
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>
2026-10-07 12:50:30 -04:00
ruv 1175bc19c9 Merge origin/main into feat/mod-toasts 2026-10-07 12:40:10 -04:00
ruv a65be10ed4 feat(mods): shared toast policy and its call sites (ADR-477), work in progress
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 12:40:10 -04:00
rUv a0ef9b8ed5 Merge pull request #3887 from ruvnet/feat/console-settings-order
feat(console): Settings: most important first (0.36.1)
2026-10-07 09:12:27 -07:00
rUv 7872e601aa Merge pull request #3559 from MAMDV/fix/plugins-prefer-installed-cli
fix(plugins): run the installed ruflo CLI before `npx @claude-flow/cli@latest` in cost-tracker, adr and metaharness (#3558)
2026-10-07 08:37:03 -07:00
ruv b461822280 fix(console): CONSOLE_VERSION follows the manifest (0.36.1)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 11:08:46 -04:00
ruv 5a0e5bff4a feat(console): Settings puts Claude control and spending first, folds ruflo config and plugin options to the end
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 10:29:40 -04:00
rUv 211a94a27a Merge branch 'main' into fix/plugins-prefer-installed-cli 2026-10-07 07:03:25 -07:00
rUv 57a9755b0b Merge branch 'main' into claude/3633-fix 2026-10-07 07:03:22 -07:00
ruv 38c30b1120 chore(mods): ruflo-mods 0.3.15 so marketplace users receive the #3791-#3805 fixes
The fixes merged in #3873 without a version bump, so 'claude plugin update'
saw no new version.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 03:51:38 -04:00
rUv 610a2e1475 Merge pull request #3877 from ruvnet/feat/console-0.36
feat(console): 0.36.0 — Events and Timeline pages: history, sources, severity, query language, lanes, overlays
2026-10-06 23:44:14 -07:00
ruv 1ac200432c feat(console): 0.36.0 integration: eventsPersist option, shared whole-batch append argv, hostile-time hardening, init ignores console/
- plugin.json declares eventsPersist (default true); version 0.36.0 in plugin.json, version.ts, smoke.sh
- data/append-argv.ts: one dd argv (bs=1M iflag=fullblock) shared by the Events store and the autopilot journal; real-dd 8-writer test fails on the old argv
- history decoders and Events/Timeline displays use #3874's timeOf/countOf/isoOf, so a hostile time or count cannot throw
- cli init: .claude-flow/.gitignore template lists console/
- ADR-474 updated to the reviewed behaviour and the open low items

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 02:19:20 -04:00
ruv 027e180c39 Merge verify/events-0.36 into feat/console-0.36
Conflict in views/manage.ts: #3874 (isoOf) edited eventsView, which the Events work moved to views/events.ts; the move wins and the isoOf clamp is applied at every Events/Timeline site instead.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 02:19:20 -04:00
rUv 7ee853ee34 Merge branch 'main' into fix/mods-3791-3805 2026-10-06 23:02:04 -07:00
ruv 7782ccbf60 fix(console): log Claude's refused request when the person's card is waiting; mission-auto why when not wired; document the local-read allowlist
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 01:06:51 -04:00
ruv e5d887af43 test(ruflo-mods): the /clear rollup record keeps the ending session's rung, the next starts at OK (#3795)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 00:58:38 -04:00
ruv 6258d60127 fix(guard): decode $'...' escapes as bash does; adversarial and benign tables for the root-delete guard (#3791)
$'\x2f' and $'\x72m' name the root and rm without any expansion, and a
\' inside $'...' does not close the string. The scanner now decodes ANSI-C
escapes (octal, \x, \u/\U, \c, the single-letter set, NUL ends the string)
in all four copies, and the parity table gains wrapper, flag-spelling,
benign look-alike and documented-limit rows.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 00:58:38 -04:00
ruv 93b6870a1d fix(ruflo-mods): trust gate judges a glob or a negation by what it selects (#3801)
The scan reports hook patterns as written, so tool.*, prompt.*, agent.* or
!tool.describe hooked every risky event without matching a RISKY_EVENTS key.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 00:58:38 -04:00
Dragan Spiridonov 72c84437d4 fix(ruflo-mods): trust gate treats process.spawn, mcp.call/connect, session.send, config.set, prompt.submit and agent.spawn as risky; names a reload that gains risk (#3787, #3801)
refuse-risky admitted a user-tier mod that ran host commands through
$.process.spawn (process.run was listed) or through any MCP tool via
$.mcp.call, and one that steered every prompt (prompt.submit) or every
subagent (agent.spawn). Observe told the person "no risky calls or hooks".

The risk sets now cover every call in the engine's $ API that reaches
outside the session, and the two hooks from #3787. Observe-mode logging is
keyed on provenance plus the risk set, so a hot reload that gains a risky
call or hook is named again ("and every reload"), and the same risk is not
repeated.

(cherry picked from commit 566bfdc8a20409f763d312e1ae34bcd0fc6c0515)
2026-10-07 00:58:38 -04:00
Dragan Spiridonov 810fb0de48 test(ruflo-mods): pin registeredEvents to what register() hooks across every option combination (#3805)
Adversarial review follow-up: the list test only covered the conditions it
named, and the doc comment claimed smoke.sh guarded drift (it checks names,
not conditions). The matrix test calls register() with a recording on() for
256 option combinations and compares.

(cherry picked from commit d857b4d136)
2026-10-07 00:58:38 -04:00
Dragan Spiridonov fff705bb3a fix(ruflo-mods): capabilityProbe counts session.measure, agent.spawn and plugin.register only where the options hook them (#3805)
registeredEvents() listed them as always registered, so with default options
the probe counted session.measure as "fired" with no ruflo hook running and
listed agent.spawn as "never fired" although the mod never hooked it (and
plugin.register under modTrust: off).

(cherry picked from commit 3a146c08dc)
2026-10-07 00:58:38 -04:00
Dragan Spiridonov 8613d5bdfe fix(ruflo-mods): stand down for legacy CLI hooks route|post-edit settings and check the %USERPROFILE% helper (#3803)
Projects initialised before hook-handler.cjs (e.g. settings-generator at
d7212d25b wrote `npx claude-flow@v3alpha hooks route --task "$PROMPT"`) run
the CLI's own hooks command, which never reads RUFLO_MODS_OWNS. The mod saw
no classic route/post-edit there, owned both, and every prompt was routed
twice (the CLI still prints its block with the handshake set, verified on
3.52.0). A settings hook running claude-flow / @claude-flow/cli / ruflo
`hooks route|post-edit` now makes the mod stand down for that event.

On Windows the generated hook falls back to
%USERPROFILE%\.claude\helpers\hook-handler.cjs; helperHonours now checks it
beside the project root and $HOME.

(cherry picked from commit 4dec48e9f5)
2026-10-07 00:58:38 -04:00
Dragan Spiridonov c79f66e89f fix(ruflo-mods): keep main's Google-key and JWT matches when glued to a dash; no ^ at mid-line window starts (#3798)
Fourth review (differential vs main over 154k inputs): two secret shapes
main caught were missed after the earlier tightening - a Google key glued to
"-suffix" (the trailing lookahead rejected it; \b now also ends it) and a
JWT after a '-' (the new lookbehind; the rule now starts at the first eyJ
after a '-' or the run start, still once per run and linear). A later window
that starts mid-line gets a lead character so ^ cannot treat a benign
"system:" there as a role tag. Inbound and outbound now build the windows
once and pass them to scanWindows(). Two tests (each fails on the previous
head); corpus unchanged.

(cherry picked from commit 5e9cec209c)
2026-10-07 00:58:38 -04:00
Dragan Spiridonov 0e505ffcef fix(ruflo-mods): screen three readings so stripping or folding never glues a phrase to the word before it (#3798)
Third review: stripping every default-ignorable character and NFKC folding
joined what followed to the word before it, so a leading \b or lookbehind
failed: "x" + soft hyphen + "Ignore all previous instructions", a circled
digit before AKIA..., and a zero-width space before an SSN all passed, where
main caught them (129 of 1,093 sampled inputs).

windows() now screens three readings: the folded one, main's literal one
(only its original invisible set removed) and a spaced one (invisible
characters become spaces), each whitespace-collapsed and windowed, so cost
stays linear. The role-tag rule is back to main's \s* (linear after the
collapse; it caught "system\n:"), and the key rule accepts doubled or mixed
separators again (my--token=). One test pins seven of these cases; it fails
on the previous head.

(cherry picked from commit 000f677c36)
2026-10-07 00:58:38 -04:00
Dragan Spiridonov 6f88e5e9ae fix(ruflo-mods): screens stay linear on blank lines and repeated token starts; whitespace padding cannot straddle a window (#3798)
Second review: once the whole text is screened, two older rules that were
only ever run on a 20k prefix became the cost: `fake role tags` (^\s* with
m) is quadratic on runs of newlines (1 MB of "\n": 16.8 s) and `jwt` (\beyJ)
restarts at every '-' ("-eyJ" x 1 MB: 8.2 s). Unbounded \s in shell pipe,
key assignment and bearer also let padding carry a match across a window.

- bare() collapses each whitespace run to one space or newline before
  windowing (linear; screening only tests text, never returns it).
- jwt starts once per token run; the anchored role-tag half uses [ \t].
- key assignment accepts a CLI flag prefix again (--password=, --token=),
  which main caught.
Three tests pin these (1 MB of blank lines and "-eyJ" under 1.5 s, a pipe
padded with 1.1k-25k spaces at window boundaries, CLI flags); each fails on
the previous head.

(cherry picked from commit 2ffd534404)
2026-10-07 00:58:38 -04:00