Give repo list a name you can act on
Commit

repo list --project acme printed ID / NAME / PROJECT / CLUSTER / STATE,
where ID and PROJECT are ULIDs and NAME is the bare name. repo view
now takes the /et/<project>/<repo> path and nothing else, so no cell in
that table was a ref: copying any of them into the verb that shows a
repository failed, and neither the help nor the refusal said where a
usable one comes from. Narrowing the grammar was intended; leaving the
directory with nothing printable was not.
The columns are repo mirror list's, for the same facts under the same
headers and the same colours — one directory should not paint a private
or a failed repo differently from the other. NAME carries the path, so
every cell composes with repo view again. The ULID and project columns
go: neither addresses anything, and --json still carries both.
STATUS speaks the placement vocabulary via primaryPlacementStatus, as the other views do. It dashes where the listing returns no state, which happens per repo rather than per project — 15 of 26 across six projects carried one, so the column earns its place rather than always dashing. ACCESS is the one column left out: it describes a GitHub repo not yet onboarded, and nothing in a project listing can be one.
The path needs the project's NAME, which the repo records do not carry. resolveProjectRefNamed answers with the server's own spelling from the by-name lookup it already makes, and costs one GetProject only when the caller passed a ULID.
NAME (owner/repo) becomes NAME in both directories: the cells are
forge-qualified, so the header was explaining what they already show.
preStyleTable goes with repo list's old styling — it had no other caller.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com Entire-Checkpoint: 01M3S978JG37HC6J366NXFYTAZ