A diverse, end-to-end checklist for exercising the biorouter CLI and verifying
parity with the desktop GUI. Status legend:
- [verified] — exercised headlessly in this pass and confirmed working.
- [manual] — requires a real interactive terminal (raw-mode TUI keystrokes) or a live provider; steps given, to be run by hand.
- [audited] — verified by code review + automated
TestBackend/unit tests (cannot be driven headlessly). - [gap] — known GUI-parity gap (not yet in the CLI).
Run from the repo root after source bin/activate-hermit && cargo build -p biorouter-cli.
Binary: ./target/debug/biorouter. Force the classic readline UI with
BIOROUTER_CLI_CLASSIC=1; the full-screen TUI is the default on a TTY.
- [verified]
biorouter --version,biorouter --help, every<cmd> --help. - [audited]
biorouter session→ full-screen TUI (default on a TTY). - [manual]
BIOROUTER_CLI_CLASSIC=1 biorouter session→ classic readline REPL. - [verified]
biorouter run -t "<prompt>"→ headless prompting (one-shot). - [manual]
echo "<prompt>" | biorouter run -i -→ instructions from stdin. - [manual]
biorouter run -t "..." --output-format jsonandstream-json. - [verified] Non-TTY / piped invocation auto-falls back to the classic path.
Input & editing:
- [audited] Type text; blinking bar (I-beam) cursor sits at the insertion point.
- [audited] CJK / wide chars (e.g.
你好世界) keep the caret at the true end. - [audited]
Ctrl+Jinserts a newline; multi-line compose grows the input box (≤6 rows). - [verified] Paste of multi-line text inserts as one chunk and does not submit prematurely (bracketed paste; unit-tested).
- [audited]
←/→/Home/Endmove by character;Backspacedeletes by character. - [audited]
↑/↓recall input history (single-line buffer). - [audited] Slash ghost autofill: typing
/codims inmpact;Tabaccepts. - [audited]
Entersubmits a non-empty buffer; empty Enter is a no-op.
Layout & chrome:
- [audited] Greeting shows the coral-brown
BIOROUTERwordmark, tagline, and working directory line. - [audited] Two-line status: line 1 = model · provider; line 2 = N skills · N extensions · N knowledge bases · context meter (right-aligned).
- [audited] Context meter updates after each turn; warns red ≥85%.
- [audited] ~2-row gap separates the response from the input box.
- [audited] Window starts compact and grows downward as the chat fills, then scrolls.
- [manual] Mouse wheel / PageUp / PageDown scroll the history; latest output stays visible.
- [manual] Terminal resize reflows without corruption.
Turns, tools, control:
- [verified] Send a prompt → streaming response renders; thinking spinner on the input border.
- [verified] Tool calls render as a distinct
▸ tool callbadge (tool + namespace); arguments in plain text (no green). - [manual] Permission modal: a tool needing approval shows a modal;
↑/↓+Enterpick Allow / Always allow / Deny / Cancel;Esc/Ctrl+Ccancels. - [manual] Ctrl-C mid-stream cancels the in-flight response promptly (event-channel fix).
- [audited] Markdown rendering: headings, bold,
inline code, bullets, code fences.
Slash commands (TUI):
- [audited]
/help,/?→ in-TUI command + navigation help (now lists/compact). - [verified-by-code]
/clearclears the persisted conversation + token counts + scrollback (no desync; sharedclear_conversation). - [manual]
/compact→ condenses the conversation via a normal turn. - [audited]
/exit,/quit→ leave;Ctrl+Con empty input quits. - [audited] Other slash commands show a "use BIOROUTER_CLI_CLASSIC=1" note.
- [audited] Panic safety: a render panic restores raw mode / alt screen / cursor
(panic hook) — terminal is never left corrupted;
Tui::Dropcovers the error path.
- [manual]
/help,/t [light|dark|ansi],/r,/mode <m>,/plan…/endplan,/compact,/clear,/prompts,/prompt <name>,/workflow,/extension,/builtin. - [audited] Interrupt handling no longer panics on an empty last message.
- [verified]
biorouter models current— shows configured provider+model. - [verified]
biorouter models providers— lists providers + defaults. - [verified]
biorouter models list <provider>— known models; unknown → clear error. - [manual]
biorouter models set --provider <p> --model <m>— writes shared config.yaml. - [manual]
biorouter configure— interactive provider/key wizard.
- [verified]
knowledge list— visible (●) vs hidden (○) model, with a hint line. - [verified]
knowledge active,knowledge active --set <id>,--clear. - [manual]
knowledge create <id> --name "<n>"— creates + sets active when none. - [verified]
knowledge hide <id>/knowledge unhide <id>— controls agent visibility; unknown id → clear error. - [verified]
knowledge query "<q>"— live LLM answer over the active base (verified end-to-end). - [manual]
knowledge ingest --url <u>/--file <p>/--text "<t>" [--focus ...]. - [manual]
knowledge lint [--fix]— deterministic scan (verified clean) + optional autofix. - [gap] No CLI for knowledge graph, history/restore, or
.brkbexport/import (GUI/server-only).
- [verified]
extension list— configured extensions with enabled/disabled dots. - [manual]
extension install <file.brxt> [--env K=V] [--secret K=V] [--no-enable]— extracts to~/.config/biorouter/extensions/<name>, runsuv sync, registers a stdio extension; missinguv→ actionable error; missing file → clear error (verified). - [manual]
extension remove <name> [--purge]. - [manual] In a session:
/extension <ENV=v cmd args>,/builtin <names>.
- [verified]
skill list— installed skills (incl. bundles). - [verified]
skill install <file.zip> [--force]— single skill and bundle layouts (verified install + remove round-trip); bad/missing zip → clear error. - [verified]
skill remove <slug>.
- [verified]
workflow list— local + GitHub workflows. - [verified]
workflow install <file.json|yaml>— validates + saves to the library; wrong extension → clear error. - [manual]
workflow validate <name|path>,workflow deeplink <name>,workflow open <name>. - [manual]
biorouter run --workflow <name|path> [--explain].
- [verified]
schedule list(empty → "No scheduled jobs found"),schedule cron-help. - [manual]
schedule add …,schedule run-now <id>,schedule sessions <id>,schedule remove <id>.
- [manual]
session --resume/--name/--session-id;session list,session remove,session export,session diagnostics.
- [verified]
info,info --verbose(brand now reads "Biorouter"). - [verified]
completion <bash|zsh|fish|…>. - [manual]
project,projects(interactive directory manager). - [manual]
update [--canary],web,term,mcp <server>,acp.
- [verified] Unknown subcommand, missing files, unknown provider, missing
--kb, wrong workflow extension → all produce clear, non-panicking errors (exit ≠ 0).
infoprinted "BioRouter" → corrected to "Biorouter".- TUI
/clearonly reset in-memory messages → now clears the persisted conversation- token counts (shared
CliSession::clear_conversation), so the context meter and a reopened session stay correct.
- token counts (shared
- TUI lost/delayed keystrokes (incl. mid-stream Ctrl-C) because multiple
EventStream::next()futures raced acrossselect!arms → a single reader task now forwards events over an mpsc channel (cancel-safe). - Multi-line paste fired line-by-line (premature submit) → bracketed paste enabled; pastes insert as one chunk.
- No terminal restore on panic → installed a panic hook restoring raw mode / alt screen / cursor before the default hook.
- Scroll height estimate counted chars, not display width → wide (CJK) lines could clip; now uses unicode width.
- Tool-call permission cancel could desync the conversation → now drains the stream after cancelling.
- Classic interrupt handler could panic on an empty last message → now a graceful warn.
/compactwas unavailable in the TUI → now wired (sends the compaction trigger turn).
- Image/file attachment (multimodal input) — GUI-only.
- Voice dictation (Whisper) — GUI-only.
- Knowledge graph view, history/restore,
.brkbexport/import — server/GUI-only. - First-class secrets-management command (keys only via
configure/ per-extension--secret). - Dashboard canvas, interactive MCP Apps/MCP-UI, session-sharing tunnel, response-style settings — GUI-only.