Skip to main content
These commands cover the cycle of building, testing, and debugging a project’s workflows: authoring and validation (jelou workflow), local testing with traces (jelou test), production triage (jelou logs), and user state reset (jelou users).
Syncing workflows to local files (jelou link, pull, status, push, incoming) is documented in Projects and channels.

jelou workflow

jelou workflow has 16 subcommands in total (besides the ones above: update, set-default, delete/rm, hide, unhide, allow-user, allow-country, evaluate, skill, build, branches, canonicalize-branch, inject-ecommerce, adopt, authoring). Explore them with jelou workflow --describe.
validate runs a canonical multi-phase pipeline (schema → autofix → normalize → ids → config → quality → whatsapp → edges → lint → finalize) and reports { status, errorCount, warnCount } per phase. With errors it exits with a non-zero code; --allow-warnings exits 0 if only warnings remain. Additional flags: --fix (alias --write) canonicalizes the file in place (mints ids, normalizes branch tokens, repairs edge handles); --quiet only prints files that have errors or warnings; --out <path> saves the same JSON payload to disk in addition to stdout. --partial <file> runs the full validator on a single in-progress draft in preview mode: it returns rich diagnostics but never gates — it always exits 0 regardless of errors. As of v1.88, a validate-on-write hook runs this same preview automatically the moment an AI agent writes a workflow’s JSON, so diagnostics arrive immediately (they’re advisory only: they never block the write). Also as of v1.88, validate now validates tools/*.json files too (not just workflows/*.json) using the real tool-push rules, and it no longer incorrectly flags $output.set() inside a tool’s CODE node — that’s the correct way a tool returns a value.

jelou test

Test workflows locally: send messages, persist traces and chats, and inspect them.

Local testing dashboard

It brings up a single-URL local web interface (Hono server + React UI) to visually inspect your workflow tests — it’s the graphical version of what jelou test send text, jelou test chats list, and jelou test trace produce. What it shows:
  • Targets / workflows — the workflows you can test (those that have recorded runs, plus the ones in the lockfile even if they don’t have any yet).
  • Runs (test chats) — each recorded test conversation, with its turns, the rendered message, and its terminal status (STABLE, TIMEOUT, HARNESS_STALL, HARNESS_ERROR).
  • Per-node trace — for each run, the workflow’s step-by-step execution: each node with its initial and final state.
Internally it serves these read-only endpoints (/api/targets, /api/workflows, /api/runs, /api/runs/:id, /api/runs/:id/trace) and, if there’s a profile that can send messages, it lets you start new chats from the UI (POST /api/chats, /api/runs/:id/messages). What data it works with:
  • It reads the per-target qa.db files (SQLite) — the same ones the other jelou test commands create and query. There’s no separate database: the dashboard only visualizes them.
  • Data is isolated per repo (repo-id segment = git root directory name + a short hash) and per profile. That’s why you must run it inside the repo with your runs, or point it at another one with --repo <segment>.
It’s local-only (listens on loopback); for remote access use SSH port forwarding: ssh -L 8766:localhost:8766 <host>.
The BrainOps bundles jelou-build-workflow and jelou-test-workflow (skills) orchestrate this build-and-test cycle for workflows from an AI agent.

jelou logs — production conversation triage

Read-only access to a bot’s conversation history. It lets you drill down from conversation → chat timeline → the node that failed.
They all accept --from/--to (ISO-8601), --cursor for pagination, and --out <path> to save the JSON envelope. The --bot-id is the bot connected to the channel — discover it with jelou channels list. The drill-down flow prints the next command under each FAILED execution.

jelou users reset

Hard-resets a user’s cached state with a bot (clears the state, skill, and state_manual keys). Useful before re-testing from scratch or to unblock a user stuck in a loop.
It’s destructive: in-flight conversations lose their context. --bot-id and --channel-id are mutually exclusive; under --agent/--no-input, --yes is required.