# Add `entire repo mirror create` onboarding wizard

`993f948`→[main](/content/gh/entireio/cli/commits/main/index.html)·

toothbrush·3w ago·3 files·+658 added/-10 removed

Run `entire repo mirror create` with no args to onboard repos interactively:
verifies auth, multi-select repos to mirror, multi-select regions, then creates
every (repo, region) mirror in parallel and prints the clone URLs. The
positional `create <github-url> [cluster-host]` form is unchanged.

Regions come from entire-core's GET /api/v1/clusters (ListClusters). The
endpoint isn't deployed yet, so the /clusters spec fragment is hand-authored
into core.openapi.json and the ogen client regenerated; a real spec refresh is
idempotent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

## Sessions

ee0c83e58bfcView transcript

## Changes

3

- cmd/entire/cli
  - Mrepo_mirror.go+18/-10
  - Arepo_mirror_create_wizard.go+500
  - Arepo_mirror_create_wizard_test.go+140

```  
47 unmodified lines

// defaultClusterHost is the cluster the mirror commands target when the
// caller omits the <cluster-host> argument. A pragmatic single-region
// default for now — once multi-cluster selection lands this should come
// from config/context rather than a constant.
const defaultClusterHost = "aws-us-east-2.entire.io"

// mirrorCreateConcurrency bounds how many (repo, region) mirror creations run
// at once. The slow phase is the per-mirror clone wait, which is I/O-bound on
// the cluster, so a modest fan-out keeps the wizard responsive without
// hammering the control plane or the user's STS.
const mirrorCreateConcurrency = 8

// Per-mirror outcome labels shown in the results table's STATUS column.
const (
    mirrorStatusReady      = "ready"      // clone landed, ready to use
    mirrorStatusRegistered = "registered" // placement created, clone in progress (--no-wait)
    mirrorStatusEmpty      = "empty"      // upstream has no commits, nothing to clone
    mirrorStatusSuspended  = "suspended"  // placement exists but the cluster won't issue clone tokens
    mirrorStatusTimedOut   = "timed out"  // clone didn't finish within --wait-timeout
    mirrorStatusError      = "error"      // create or probe failed
)

// regionChoice is one mirrorable region offered by the create wizard's region
// picker, sourced from the control plane's cluster catalog
// (GET /api/v1/clusters via availableRegions).
type regionChoice struct {
    slug         string
    jurisdiction string
    host         string // bare cluster host passed to CreateMirror / validateClusterHost
    isDefault    bool
}

// mirrorTarget is one unit of work: a selected repo to be mirrored into a
// selected region. The wizard creates the cross-product of repos × regions.
type mirrorTarget struct {
    owner  string
    repo   string
    region regionChoice
}

// mirrorResult is the outcome of creating one (repo, region) mirror.
type mirrorResult struct {
    owner       string
    repo        string
    regionLabel string
    cloneURL    string
    status      string // ready | registered | empty | suspended | timed out | error
    err         error
}

var mirrorCreateResultColumns = []string{"REPO", "REGION", "STATUS", "CLONE URL"}

func mirrorCreateResultRow(r mirrorResult) []string {
    url := r.cloneURL
    if url == "" {
        url = placeholderDash
    }
    return []string{r.owner + "/" + r.repo, r.regionLabel, r.status, url}
}

```
