render an exception for the user, never as an empty string.Several atproto SDK exceptions (InvokeTimeoutError among them) carry no
message, so interpolating them produced a bare “error:” with nothing after
it — a failure the user cannot act on or even name.
cmd_spaces_list(client: AsyncClient, pds_url: str) -> int
list permissioned spaces, degrading to an empty result if unsupported.Enumeration has a legitimate empty answer, so an unsupported PDS is
reported explicitly and exits 0 rather than failing — but it always says
why, so “none” is never silently indistinguishable from “can’t ask”.