junco
contents

The dashboard

The dashboard runs fullscreen in the terminal's alternate buffer, adapts its layout to the window (a third pane appears at 110 columns and up), and restores the terminal exactly on exit. It needs a real TTY — not piped, not backgrounded. Flags: CLI reference.

junco dashboard

Two modes

Swap modes any time with m / Shift+Tab, or click the header's tab pair.

With github.enabled = false the dashboard opens into LOCAL — there is nothing for GITHUB mode to show. A shared header carries a live daemon pulse in both modes: issues awaiting review, PRs needing attention, the processed record, daemon up/down, queue depth, and unpushed outbox ops.

The panes and keys

GITHUB mode has three zones: the repos pane (pane 1, with the queue card at top), the issues pane (pane 2, the selected repo's trigger-labeled issues with state badges), and the PR monitor (pane 3, wide terminals only, the selected repo's junco-authored PRs). A persistent shortcut bar shows the keys for wherever focus is.

LOCAL mode replaces the panes with a section rail (Queue, Outbox, Repos, Worktrees, Daemon) and a body:

Rows the daemon owns — running queue entries, live worktrees — render but are never selectable; the cursor skips them.

note — every GITHUB-mode action is an ordinary label mutation made through your own gh auth. Dispatch, approve, and re-plan run nothing themselves; they move labels the daemon's sweep acts on — see the GitHub loop.

The command palette

: opens the palette: type to filter, enter to run. Commands that take arguments — list, retry, outbox, submit, logs, service — get an args field first. Each run spawns the actual junco CLI as a subprocess against the dashboard's own config — no reimplementation, no drift, no shell in the middle. The command's real output appears in a scrollable pane with its exit code; r re-runs, esc returns. logs runs bounded (-n 200); init, start, and dashboard are greyed out with the reason they can't run here (use restart for the daemon). LOCAL-mode mutations — requeue, delete, flush, restart, prune — use the same subprocess model.

Mouse support

In GITHUB mode the mouse works throughout: clicking a row focuses its pane and selects it; clicking the already-selected row opens it, exactly like enter. Clicking blank pane space focuses the pane without moving the selection. The wheel acts on whatever pane is under the cursor. Detail views carry a clickable owner/repo#n line (cmd+click in OSC 8 terminals, or o) to open the item on GitHub. Hold shift while dragging to select terminal text. In LOCAL mode only the header tab is clickable; local rows are keyboard-first in v1.

The first-run walkthrough

With no config yet, bare junco or junco dashboard opens a guided setup in chapters: workspace, model setup (an inference endpoint with live discovery, or a hosted provider from the built-in catalog), repo containment, the GitHub bridge, an Account chapter for the dedicated bot identity, and the recommended extras. It then creates the queue, verifies the result with a flight check, and lands in the dashboard. Re-run it anytime from the palette ("setup") — it only writes what changes. The headless equivalent is junco config init; the full key reference is Configuration.

Watching repos

w prompts for owner/repo or a github.com URL; an empty clone path clones into <dataDir>/clones/watched/<owner>/<repo>. It validates the clone's origin, confirms reachability via gh, and creates the trigger label if missing. Entries live in <dataDir>/watchlist.json, separate from github.repos in config.json; the daemon's bridge sweep re-reads the file every sweep, so watchlist changes apply without a restart. Where a repo appears in both, the config entry wins — config-sourced repos carry a (cfg) marker, are read-only in the dashboard, and x reports where they're defined instead of removing them.