A friendlier front end
to Fedora Copr.
coprctl is a command-line and agent interface for the Fedora Copr build service. Copr does the heavy lifting: it turns your sources into signed RPM repositories. coprctl makes that easier to drive, in a terminal or from an agent.
~/.config/copr with no import. auth login sets up a fresh token or an extra instance.One grammar, everywhere.
Every command is coprctl <resource> <verb> [ref]. A new source type is a flag value, never a new command. Learn it once, drive it by hand or by machine.
Built for people and agents.
Tail builds without polling.
Watch the logs Copr already produces, across chroots, with one command.
coprctl log tailmulti-chrootcoprctl build watchto completion
Structured output.
--output json|jsonl|yaml on every command. Human output is a rendering of the same structs.
stable exit codes4·8·9·12structured errorscode + hint
Project state as code.
A copr.yaml manifest describes the project; apply, diff, and export reconcile it against Copr.
coprctl applyreconcilecoprctl diffdrift = exit 12
Agents get the same surface.
The agent skill is generated from the command registry, so it cannot drift from the CLI. MCP, schema, and completions all come from one source.
schema outputdrives agentsgenerated skillnever drifts
Rebuilds on tag, wired up.
GitHub integrations configured in one call, defaulting to tag-only triggers.
integration enableone commandtag-only defaultdeliberate releases
Point it at any Copr.
Production, staging, openEuler, or self-hosted. Profiles are first-class and swap in one flag.
--profile NAMEswap instanceoffline catalogcached chroots
Why a wrapper at all.
Copr works, the CLI lags it.
coprctl keeps Copr's vocabulary and API, and fixes the ergonomics around them: one grammar, live logs, declarative state.
Nothing else to install.
A single static binary. Copr does the building; coprctl just talks to it. No runtime, no dependencies.
Read without configuring.
Browsing, monitoring, and log reading fall back to anonymous access when no profile is set. Writes still ask for credentials.
Text first, TUI only where it helps.
A dashboard appears only when it beats text and never blocks automation. Default output stays a clean stream.