From d7a72a39567dc8cba4dd3f9032eff8dc9593cc8f Mon Sep 17 00:00:00 2001 From: nicodes Date: Mon, 3 Aug 2026 13:15:34 -0600 Subject: [PATCH] Show who is in a studio `termcade org show` listed a studio's games and not its people, because nothing could ask: the public org page reports roles without addresses, and the endpoint that names them behind membership did not exist until now. Attempted and quietly skipped when it fails. A studio page anyone can read should not start failing because the reader does not belong to it. Co-Authored-By: Claude Opus 5 (1M context) --- account.go | 13 +++++++++++++ internal/registry/client.go | 14 ++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/account.go b/account.go index 978a921..7bd73e4 100644 --- a/account.go +++ b/account.go @@ -266,6 +266,19 @@ func cmdOrg(args []string) error { for _, game := range org.Games { fmt.Printf(" %s\n", game) } + // Only members see addresses, so this is attempted and quietly + // skipped: a studio page you can read without belonging to it should + // not fail because you do not. + if members, err := client.Members(args[1]); err == nil && len(members) > 0 { + fmt.Println() + for _, m := range members { + role := "member" + if m.Admin { + role = "admin" + } + fmt.Printf(" %-32s %s\n", m.Email, role) + } + } return nil case args[0] == "add": diff --git a/internal/registry/client.go b/internal/registry/client.go index 83f6193..9443261 100644 --- a/internal/registry/client.go +++ b/internal/registry/client.go @@ -424,6 +424,20 @@ func (c *Client) Org(name string) (Org, error) { return out, c.do(http.MethodGet, "/v1/orgs/"+url.PathEscape(name), nil, &out) } +// Member is one person in a studio. Email is present only to members: the +// public org page reports roles without addresses. +type Member struct { + Email string `json:"email,omitempty"` + Admin bool `json:"admin"` +} + +// Members lists who is in a studio. Membership is enough to read it — +// administering is what changing it needs. +func (c *Client) Members(org string) ([]Member, error) { + var out []Member + return out, c.do(http.MethodGet, "/v1/orgs/"+url.PathEscape(org)+"/members", nil, &out) +} + // AddMember adds somebody to a studio, or changes whether they administer it. func (c *Client) AddMember(org, email string, admin bool) error { body := map[string]any{"email": email, "admin": admin}