Set up a project
/echo:setup onboards one repository onto Echo. Run it once, from that
repo’s root. It inspects the repo to pre-fill proposals, interviews you for
anything it can’t detect, provisions the GitHub Project board, writes the
per-project config, registers the project, and finally gates on a clean
dry-run sweep — nothing dispatches until that passes.
Re-running /echo:setup on an already-onboarded repo is always safe: an
existing .claude/echo/config.json puts setup into reconfigure mode, and
every write backs up the previous file with a timestamp before overwriting.
What the interview walks through
Section titled “What the interview walks through”-
Inspect (read-only). Setup runs
inspect.sh, which parses youroriginremote for theowner/reposlug, finds the default branch, checks for aCLAUDE.md, guesses a test command, and detects an existing config. It never writes anything or hits the network — it just pre-fills every proposal. -
Interview (one question at a time). Each question shows a proposal you can accept with a bare Enter. You’ll confirm or provide:
- the repo (
owner/repo) and whether the owner is an org or user account (user-owned boards need theprojectscope) - whether to create a new GitHub Project or adopt an existing one by number
- the status columns — the default eight are Backlog, Ready, Planning, In progress, AI reviewing, Needs Human, Building & Deploying, Done
- priorities (default
P0/P1/P2) and an optional path-prefix → Category map - optional supporting repos (ArgoCD/Helm, Terraform, infra) that deploys may need to sync
- deploy verification:
none(“trust CI”),command(a stored read-only health check), ork8s-argocd(follow the build → image-tag-bump → ArgoCD-sync → rollout pipeline) - gated paths (default
[".claude/echo/**"]), design-doc /LESSONS.mdlocations, an optional Discord channel, and worker caps / model tiers (defaultworkers.slots: 2)
- the repo (
-
Preflight.
preflight.shruns the readiness checks (gh installed + authenticated, repo read access, Projects v2 scope,jq >= 1.6,git >= 2.30) and prints a full punch-list. Setup stops here until a re-run exits clean. -
Provision the board.
provision_board.shruns first as a--dry-runthat prints[DRY-RUN] would: ...lines for your confirmation, then for real. It creates-or-adopts the Projects v2 board and ensures theStatus,Category,Priority, andSizefields and their options exist — preserving any options already present. If it created a new project, it reports the newPROJECT_NUMBER, which setup folds into the config. -
Write config + register.
write_config.shwrites.claude/echo/config.json(backing up any existing one with a timestamp), andregister_project.shadds — or replaces, never appends — this repo’s entry in the machine registry at~/.config/echo/registry.json(override withECHO_REGISTRY). If you gave a Discord channel, setup posts a one-time confirmation to verify it’s reachable. -
Bootstrap CLAUDE.md (optional). If your repo has no
CLAUDE.mdor a thin one, setup offers to draft a subsystem-mapCLAUDE.mdfor your review — applied only once you approve. -
Final gate. Setup runs
tick.sh --dry-run --project <name>. Nothing dispatches for this project until this passes cleanly — its output is your closing confirmation that onboarding is complete.
What setup writes
Section titled “What setup writes”Two files, in two places:
-
.claude/echo/config.json— committed in your repo. Holds only the keys you changed from the plugin defaults; the rest are merged in at read time from the plugin’sdefaults.json. This is the full per-project contract: board coordinates, status names, priorities, worker caps, deployverifyblock, gated paths, review policy, and so on. (See the config reference for every key.) -
~/.config/echo/registry.json— the machine-level registry, not in your repo. One entry per onboarded project: itsname, physically-resolvedrepoRoot,enabledflag, and Discord channel. The hub sweep reads this to know which projects to visit.
Next step
Section titled “Next step”With the board provisioned and the project registered, kick off your first run →.