Architecture overview

On this page

The tool is a single static binary built with the Go toolchain. Its command layer is a Cobra command registry that is the single source of truth: CLI, completions, JSON schema, MCP tools, docs, and the agent skill are all generated from it.

Layers

The implemented package layout mirrors the working spec:

Layer Role
cmd/coprctl entrypoint
internal/cli Cobra command registry plus schema generation
internal/copr API client against the /api_3 REST surface
internal/ref the one reference parser, shared by every command
internal/cerr structured error objects and stable exit codes
internal/config profiles, precedence, legacy config import
internal/render table, plain, json, jsonl, yaml formatters
internal/state local cache and webhook-secret store
internal/events the event bus and polling source
internal/logstream the log tailer and failure extraction
internal/logdetective the log-detective.com helper
internal/manifest declarative copr.yaml
internal/forge GitHub webhook management
internal/secrets secret-handler abstraction
internal/runtime container runtime abstraction for preflight
internal/tui the Bubble Tea dashboard
internal/mcp the MCP server

Repository layout

See the working spec for the full layout. The key invariant: the command registry is the only place a new capability is declared.

API client

The Copr v3 REST API is consumed directly. A machine-readable Swagger document is served at the instance's /api_3/swagger.json, which informs client generation. The client is kept behind an interface for testability.

Read-only commands fall back to an anonymous production client when no profile is configured, so browsing, monitoring, and log reading work without any configuration.

See agent contract for the machine-facing contract.