junco
contents

Bot account

By default every gh and git call junco makes runs under your ambient gh auth login — PRs, comments, labels, pushes, and commits all appear as you. botAccount.enabled routes daemon traffic through a dedicated machine account instead: a second, regular GitHub account (e.g. junco-agent), not a GitHub App. Off by default; behavior is unchanged until enabled.

Why

note — with botAccount.enabled true but the bot's login missing or expired, junco start and junco run-once refuse to run, pointing at junco auth login. There is no silent fallback to your personal identity.

Setup

Create the machine account on github.com, then log it in with junco auth login: it runs gh's own device-flow login into an isolated GH_CONFIG_DIR (default ~/.junco/gh, separate from your own gh config; a legacy login at ~/.config/junco/gh keeps working until junco data migrate moves it), verifies the resulting identity, and flips botAccount.enabled to true on success. Nothing secret lands in config.json or the daemon's environment — gh owns token refresh, and the sandbox deny-lists the bot's config dir from agent reads (Security).

Grant repo access with junco auth grant: it invites the bot as you (admin on the repo required), accepts the invitation as the bot from its isolated config dir (bounded retry — invitation propagation can lag), then verifies the bot has push before reporting success. Idempotent — re-running on a granted repo is a no-op. Restart the daemon to apply the identity, and let junco doctor verify: it resolves the bot's identity (hard failure if not logged in) and checks its permission on each watched repo — write/maintain/admin passes; triage warns that label edits work but branch pushes fail; anything less warns to invite the bot. Repos you don't own need no invite at all — fork-PR mode provisions the fork on the bot's account.

junco auth login
junco auth grant acme/reef-api
junco restart
junco doctor
✓ junco-agent has write on acme/reef-api

Caveats

warn — dispatching, analyzing, or assessing an issue on an unwatched repo the bot can push to auto-onboards it: the repo is added to the watchlist as a first-class entry and the bridge sweeps it for trigger labels from then on — permanently, with no confirmation step. Unwatch it from the dashboard (x on the repo) or remove its entry from <dataDir>/watchlist.json.