All notable changes to this project will be documented in this file. Format based on Keep a Changelog and Semantic Versioning.
bn broadcast(and any other--force-lesspasteTextcaller) reported "claude not running in pane" even when claude was actively running. On macOS, tmux'spane_current_commandonly resolves the direct child ofpane_pid; banyan's launch script chainszsh → bash → claude(the script doesn'texec), so tmux reported "bash" andisClaudeRunning()returned false. The check now walks the full descendant tree ofpane_pidvia a singlepssnapshot, matching onclaudein any comm. No more false skips during broadcast.
bn <project> broadcast "<prompt>"CLI command +banyan_broadcast_taskMCP tool — send the same prompt to every live feature agent in a project, in one call. Useful when 10+ features in parallel need to react to the same context (e.g. "check your TODOs", "scope was clarified", "pause and report"). Reserved panes (ops / orchestrator / terminal) are skipped automatically. Optional--only <feat-a,feat-b>and--exclude <feat-c>for fine targeting;--forceto send even when claude isn't detected as running in a pane. Returns the list of features that received the prompt and those skipped with reason.
agents-<project>tmux window now switches totiledlayout once it has 4+ panes, instead of always usingmain-horizontal. Past 3 claudes side-by-side,main-horizontalsquished each pane into an unreadable ~140px vertical sliver; tiled distributes the panes in a grid (4×3 / 3×4 / etc.) so every claude gets ~25% of the area. Single feature workflows are unaffected — they still getmain-horizontalwith ops at the bottom.
- Orchestrator (and per-feature) Claude agents lost access to every banyan MCP tool.
ensureBanyanMcpConfigwires the agent's--mcp-configto callbanyan mcp-serve --scope <scope>, but themcp-serveCLI command never declared--scopeto commander, which rejected the invocation witherror: unknown option '--scope'before the server could start. Every fresh agent therefore booted with zero banyan tools and had to fall back to bash/git when the user asked it to dispatch features. Added--scope <scope>to the CLI declaration so commander lets the flag through; the parser inmcp/server.tsalready reads it fromprocess.argv. Existing config files in~/.config/banyan/*-mcp.jsonkeep working — no migration needed.
bn <project> starthijacked unrelated tmux sessions when the project name was a prefix of an existing session name. tmux resolves session/window targets with prefix matching by default, sotmux has-session -t p4nreturned true if a manually-createdp4n-dashboardsession was running — banyan then added itsworkspacewindow into that foreign session instead of creating its own. Every session / window / pane target insrc/tmux.tsnow goes through=name(exact-match prefix) helpers, removing the ambiguity.
- Remote access surface in the dashboard's Workspace settings. When you start with
bn serve --remote, the Config tab now shows a card with the tunnel URL + a scannable QR code (SVG, served from/api/remote/qr.svg) so you don't have to keep the terminal QR open. When--remoteisn't on, the card surfaces the exact command needed to enable it. Dynamic start/stop from the dashboard itself is still a future improvement.
- serve.ts now pre-allocates the listening port so the tunnel and the http server agree on the same number even when 4242 is busy. Previously the tunnel could end up pointing at a different port than the server bound to.
- Discord Rich Presence card redesigned around global counts. Was: feature names on the top line, project + per-project count on the second line, with leaf / globe emojis. Felt redundant when only one feature was active and the emojis were opaque. Now: details =
N features · M projects(global totals, properly pluralized), state = comma-separated list of active project names. Same shape whether you have one feature or twenty. - Drop the 🌿 / 🌐 emojis. They were meant as banyan/globe indicators but read as noise.
- Discord activity update silently failed when an image key was empty or referenced an unpublished asset. buildActivity now only emits each image field when its key is a non-empty string, and only emits the companion text when the key is set. Avoids the whole-card-disappears-with-no-error trap.
- OpenRouter key section in the Config tab trimmed: one-line title, no marketing copy, no redundant sub-label. Matches the density of the Discord card next to it.
- Workspace settings (OpenRouter key, Discord toggle) were unreachable from the dashboard. They were rendered only when no project was scoped, but
activeProjectfalls back to the first project on load, so the unscoped view was never reached through normal navigation. Workspace settings now live in a dedicated section at the bottom of every Config view, with aapplies to every projecthint to clarify they cross project boundaries.
- Discord Rich Presence toggle in the dashboard Config tab. The backend
/api/discord/enabledGET + POST endpoints were already wired; this adds the UI side: a switch + connection-status badge, persisted to~/.config/banyan/discord-rpc.yamlvia the same comment-preserving writer.
bn add-reporeferences removed from CLI help/error text.bn init's commander description and thebn <project> starterror on empty projects no longer point users at a command that doesn't exist; both now point at the dashboard Config tab or direct YAML editing.
- Sidebar brand row trimmed: dropped the always-pulsing "live" dot that conveyed no real status.
The v1 cut sharpens banyan from "every plumbing tool you might want" down to the workflow that actually pays off — multi-repo worktrees, two agent modes (instead of four), and a dashboard you can drive from your phone.
bn doctor— environment check. Walks Node / tmux / git / Claude CLI / gh / glab / OpenRouter key / banyan config and prints the exact command to fix each missing piece. Runs without a config so a fresh install canbn doctorfirst.- Two agent modes —
live(default, conversational, no ceremony, can edit main directly) anddelegated(pipeline-gated: Setup → Plan → human review → Execute → Report → Merge, looped via a Stop hook). Replaces the previous 4-mode model; legacy names (interactive/assisted/autonomous/autopilot) still accepted and normalized. - Pipeline-first dashboard — every feature shows its lifecycle stage on a 5-step indicator. Plan-review and report-review dialogs appear when delegated agents pause. Per-feature actions: open in terminal, restart, cleanup.
- Live conversation viewer — opens any feature's claude transcript
in a modal, streamed line-by-line via SSE, with a reply box that
paste-and-submits into the tmux pane. Works the same locally and
over
--remote. - Remote dashboard (
bn serve --remote) — exposes the dashboard via a Cloudflare or ngrok tunnel with 32-hex Bearer token auth, prints a QR code in the terminal. The QR encodes the token as a URL hash fragment; the SPA bootstraps auth from it on first load, persists in localStorage, and strips the secret from the URL bar. SSE accepts the token via?token=since EventSource can't set headers.--rotate-tokenregenerates and invalidates old QRs. - MCP
banyan_search_transcripts— full-text search across per-feature claude transcripts. Replaces the oldbn askcommand; available to the orchestrator and to any external MCP client. - Project + repo wizard — new "+ project" dialog in the dashboard
walks naming, repo selection, and tech detection. Per-repo run
command + named presets with
activePresetswitching. bn <project> restart-orchestrator— relaunch the orchestrator pane without touching feature panes.- Cleanup tears down compose stacks —
bn cleanupnow stops the compose stack, drops volumes, and clears state in one command. - Discord Rich Presence — optional integration, off by default.
Card layout adapts to single-project (features on top, project +
count below) vs multi-project (project names + per-project feature
counts) mode. Official Banyan Discord application id baked in — no
per-user setup needed beyond
enabled: true. llm.openrouterApiKeyconfig field — OpenRouter key now lives in the banyan config (withOPENROUTER_API_KEYenv override). Set via the dashboard Config tab or by editing YAML.
- OpenRouter required for prompt-based slug naming —
bn wt -p "<prompt>"withoutOPENROUTER_API_KEY(env or config) now exits with a clearOpenRouterKeyMissingErrorpointing at the fix. The previousclaude --printfallback was removed: too slow on first use and obscured failures. - CLI surface shrunk to what's actually useful: top-level is
ls / init / doctor / serve; per-project lifecycle stays (start / stop / close / status / resume / ports / restart-orchestrator); worktree ops stay (wt / wt-rm / rebase / merge / cleanup); env subcommands stay (up / down / recreate / logs / exec / ls). - Dashboard tabs consolidated to four: Pipeline (default), Config, Shortcuts, History.
- Stricter TypeScript maintained:
noUnusedLocals,noUnusedParameters,noImplicitReturns,noFallthroughCasesInSwitch.
bn ask— replaced by the orchestrator pane + thebanyan_search_transcriptsMCP tool. Ask the orchestrator directly.bn taskandbn deploy—taskwas redundant withbn wt -p;deploywas speculative tooling that never paid off.deployCommandconfig field also dropped.bn approveand--review-planflag onwt— plan review is now an in-dashboard interaction in delegated mode.bn todo— TODO state stays on disk per feature; surfaced in the dashboard pipeline view, not via CLI.bn pulseandbn sync— file × feature pulse moved into the dashboard view; multi-feature rebase rolled intobn rebase.bn ls-features,bn wt-ls,bn reports— feature listing lives in the dashboard now; reports are read in the History tab.bn attach— folded intobn start(which already re-attached if a session existed).bn sidebar— text-mode tree view replaced by the dashboard.- ClickUp / Jira integration and the dashboard Inbox tab — task-ingestion turned out to be the wrong abstraction; the agent reads from your real-world tools by being asked.
- Six config-mutation CLI commands (
add-repo,set-base,set-run,set-layout, etc.) — config edits go through the dashboard Config tab or direct YAML editing.
- Project + repo CRUD via
bn init / add-repo / set-base / set-run / set-layout. - Worktree lifecycle:
wt,wt-rm,wt-ls,rebase,merge,cleanup. - Test runner with isolated ports per feature (
test,test-stop,test-ls). - Compose stack support via
type: composerepos with per-feature volume isolation. - Sidebar (
bn sidebar) — text-mode tree view of projects/repos/worktrees/agents. - PR/MR flow with GitLab + GitHub providers (auto-detected from origin).
- Symlink-based project shortcuts (
ln -s $(which banyan) myproject).