docs/14-product-direction.md
14 — Product Direction: cmux + herdr, t3code visual bar
signaltty is a native Linux workspace for parallel AI coding agents. Three products set the bar; every feature proposal is judged against them.
- cmux (manaflow-ai/cmux, docs) — macOS-native AI-agent terminal multiplexer. Reference for the attention loop, inline approvals, agent hooks, and socket/CLI contract discipline.
- herdr (herdrdev/herdr, docs) — open-source Rust agent multiplexer, tmux-shaped TUI. Reference for the agent-state sidebar, detection-as-data manifests, stable handles, and agents-as-API-clients (skill → CLI → raw socket).
- t3code (pingdotgg/t3code, MIT) — agent harness control surface (web/Electron/mobile). Reference for visual quality only: tokens, run rendering, diffs, micro-interactions.
The seven directives
- Attention-first shell. Ring/badge on panes, priority-sorted sidebar
(blocked → done → working → idle), jump-to-latest-unread, OS notifications
with inline actions. The product is the "which agent needs me" loop;
everything else is table stakes (cmux notification rings +
⌘⇧U, herdr sidebar with per-client seen/unseen done-states). - Inline approvals, no context-switch. Render the decision where the user already looks (cmux Feed: permission Once/Always/Deny, ExitPlanMode, AskUserQuestion). Never force the user into the agent's TUI to answer.
- Know thy agents two ways. Hooks where CLIs offer them (cmux
hooks setup: robust across CLI churn, buys session resume) + declarative per-agent screen-detection manifests where they don't (herdrsrc/detect/manifests/*.toml: data, not code, community-extensible). Never hardcode VT scraping in the GUI. - Server owns sessions; everything is a client. Named sessions,
per-session sockets, detach/resume, layout + agent restore (herdr);
versioned JSON socket API + CLI with stable handles, caller-context env,
--jsoneverywhere, a self-printing schema, cursor-based event replay + JSONL audit log (cmuxcli-contract.md+events.md). - Agents are API clients too. Ship a gated skill file (
HERDR_ENV-style: agents act only from inside a managed pane), agent→agent prompting, and await-for-blocked primitive. The multiplexer becomes an orchestration substrate: a primary agent fans out, waits, collects. - Render work like t3code, not like
tail -f. Collapse-and-count streams, narrative prose headers alternating with typed one-line tool rows, per-turn-scoped diffs (Latest turn ⌄,+N −N, per-dir groups), same-component verb-tense run states (Working for 2m…→Worked for 2m…, no mode switch), summaries over token spam (streaming off by default). Even around terminal panes, sidebar/timeline/diff/approvals follow this language. - Visual bar: Linear-grade tokens, native restraint. Semantic color roles (canvas/surface/border/text/accent), elevation via lightness + 1px hairlines, system font stacks, low density with collapse escape hatches, thin monochrome icons with color reserved for status/brand, one hand-tuned drawer curve — expressed through libadwaita patterns (Adwaita light/dark, accent, toasts, sidebar) so the app still feels like a GNOME citizen.
Deliberately not building
- cmux's Zen applies: ship a composable primitive (socket/CLI/events), let users find the workflows. No provider-matrix sprawl, no per-compositor special cases, until demand is proven.
- No Electron/web client: the GUI stays GTK4/libadwaita (see
06); t3code is a visual reference, not an architecture reference.
Sources
- cmux:
skills/cmux/SKILL.md,docs/{cli-contract,events,feed,notifications,agent-hooks,customizing-appearance}.md, Zen of cmux - herdr:
AGENTS.md,skills/herdr/SKILL.md,src/detect/manifests/,src/ui/sidebar.rs, socket API docs - t3code:
packages/shared/src/themePalettes.ts,apps/web/src/{index.css,appearanceFonts.ts}, t3code inventory (darkroomengineering/programa)