Skip to content

Commit 96822ba

Browse files
authored
feat(people): add people clients add/remove/invite/enable/disable (#689)
* Pin basecamp-sdk to the project-client-users branch The client-admission operations (UpdateProjectClientAccess, EnableProjectClients, DisableProjectClients) live on basecamp-sdk's feat/project-client-users branch (basecamp/basecamp-sdk#847) ahead of a release, so go.mod pins its head as a pseudo-version, the way the bubble-up pin did. Re-pin to the tagged go/vX.Y.Z release once it is cut, and re-sync the vendored MCP model and the Nix vendorHash from it. The vendored MCP model is synced from that head: three People operations join the catalog (served count 256 -> 259) and the seat-limit 429 on UpdateProjectClientAccess is declared non-retryable (retry_on [503]). * Add people clients: list, add, remove, invite, enable, disable The client-side counterpart of people add/remove, over the endpoints bc3#13098 shipped: PUT /projects/:id/people/client_users.json and POST/DELETE /projects/:id/client_enablement.json. A separate group rather than a --client flag: bc3 keeps the two kinds of access apart on the wire (the team endpoint drops a client's id, the client endpoint rejects a team member's), so the CLI mirrors the split. The ids the server silently drops come back as a diagnostic notice. invite takes a bare address or "Name <email>" (net/mail), or "-" for one invitee per line on stdin; --company applies to every invitee, --title to exactly one. Refusals map to verdicts: a 403 reads the project back to name "clients not enabled" against a permission problem; the all-or-nothing 422 exits validation naming each rejected row from the SDK's field errors; the seat-limit 429 exits limit_exceeded, not a retryable rate limit. disable's 403 reads the roster back so the hint is the exact remove command. people list now carries each person's client flag. * Keep a seat-limit 429 from gating later commands; answer disable's 403 honestly The resilience hooks persisted a 60-second block for every headerless 429, so the client seat-limit verdict would have refused unrelated commands for a minute. OnOperationStart now names the operation in the context and OnRequestEnd consults the SDK's declared retry set: an operation that does not retry on 429 (UpdateProjectClientAccess) is one the server answers 429 as a verdict, and it sets no block. A 429 that names a Retry-After is honored as before. disable's 403 names the remaining clients only when the roster shows some; otherwise it is a plain denial, since the same 403 answers a caller without permission. The seat-limit message no longer states a count: existing addresses take no seat and repeats count once, and only the server knows which rows those are. * Re-pin basecamp-sdk to dcd9fbd6; reject stray positionals on the project-only verbs The SDK branch head decodes the row-error selectors independently and reports client access as project_access; the pin, provenance, vendored MCP model, and Nix vendorHash follow it. list, enable, and disable take no positional, so a stray one is refused instead of discarded: with a default project configured, "disable 123" would otherwise have acted on the configured project. The remove hint disable offers separates ids with spaces so it pastes as a command. * Name every malformed invitee at once, and say which errors are local A token that is not an address is refused before any request as a usage error; the help and skill text had promised the server's validation exit for it. The local check now names every malformed token in one error instead of stopping at the first, and the docs distinguish the local refusal (usage, 2) from the server's all-or-nothing rejection (validation, 9) and seat shortfall (limit_exceeded, 10). people list's client flag is pinned by a test. * Pin basecamp-sdk to v0.17.0
1 parent ac62cdf commit 96822ba

20 files changed

Lines changed: 2159 additions & 22 deletions

‎.surface‎

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,9 @@ ARG basecamp msgs update 00 <id|url>
290290
ARG basecamp notes set 00 [content]
291291
ARG basecamp notifications read 00 <id>...
292292
ARG basecamp people add 00 <person-id>...
293+
ARG basecamp people clients add 00 <id|email|name>...
294+
ARG basecamp people clients invite 00 <invitee>...
295+
ARG basecamp people clients remove 00 <id|email|name>...
293296
ARG basecamp people ooo 00 [me]
294297
ARG basecamp people out-of-office 00 [me]
295298
ARG basecamp people remove 00 <person-id>...
@@ -925,6 +928,13 @@ CMD basecamp notifications list
925928
CMD basecamp notifications read
926929
CMD basecamp people
927930
CMD basecamp people add
931+
CMD basecamp people clients
932+
CMD basecamp people clients add
933+
CMD basecamp people clients disable
934+
CMD basecamp people clients enable
935+
CMD basecamp people clients invite
936+
CMD basecamp people clients list
937+
CMD basecamp people clients remove
928938
CMD basecamp people list
929939
CMD basecamp people ooo
930940
CMD basecamp people out-of-office
@@ -11742,6 +11752,155 @@ FLAG basecamp people add --stats type=bool
1174211752
FLAG basecamp people add --styled type=bool
1174311753
FLAG basecamp people add --todolist type=string
1174411754
FLAG basecamp people add --verbose type=count
11755+
FLAG basecamp people clients --account type=string
11756+
FLAG basecamp people clients --agent type=bool
11757+
FLAG basecamp people clients --cache-dir type=string
11758+
FLAG basecamp people clients --count type=bool
11759+
FLAG basecamp people clients --help type=bool
11760+
FLAG basecamp people clients --hints type=bool
11761+
FLAG basecamp people clients --ids-only type=bool
11762+
FLAG basecamp people clients --in type=string
11763+
FLAG basecamp people clients --jq type=string
11764+
FLAG basecamp people clients --json type=bool
11765+
FLAG basecamp people clients --markdown type=bool
11766+
FLAG basecamp people clients --md type=bool
11767+
FLAG basecamp people clients --no-hints type=bool
11768+
FLAG basecamp people clients --no-stats type=bool
11769+
FLAG basecamp people clients --profile type=string
11770+
FLAG basecamp people clients --project type=string
11771+
FLAG basecamp people clients --quiet type=bool
11772+
FLAG basecamp people clients --stats type=bool
11773+
FLAG basecamp people clients --styled type=bool
11774+
FLAG basecamp people clients --todolist type=string
11775+
FLAG basecamp people clients --verbose type=count
11776+
FLAG basecamp people clients add --account type=string
11777+
FLAG basecamp people clients add --agent type=bool
11778+
FLAG basecamp people clients add --cache-dir type=string
11779+
FLAG basecamp people clients add --count type=bool
11780+
FLAG basecamp people clients add --help type=bool
11781+
FLAG basecamp people clients add --hints type=bool
11782+
FLAG basecamp people clients add --ids-only type=bool
11783+
FLAG basecamp people clients add --in type=string
11784+
FLAG basecamp people clients add --jq type=string
11785+
FLAG basecamp people clients add --json type=bool
11786+
FLAG basecamp people clients add --markdown type=bool
11787+
FLAG basecamp people clients add --md type=bool
11788+
FLAG basecamp people clients add --no-hints type=bool
11789+
FLAG basecamp people clients add --no-stats type=bool
11790+
FLAG basecamp people clients add --profile type=string
11791+
FLAG basecamp people clients add --project type=string
11792+
FLAG basecamp people clients add --quiet type=bool
11793+
FLAG basecamp people clients add --stats type=bool
11794+
FLAG basecamp people clients add --styled type=bool
11795+
FLAG basecamp people clients add --todolist type=string
11796+
FLAG basecamp people clients add --verbose type=count
11797+
FLAG basecamp people clients disable --account type=string
11798+
FLAG basecamp people clients disable --agent type=bool
11799+
FLAG basecamp people clients disable --cache-dir type=string
11800+
FLAG basecamp people clients disable --count type=bool
11801+
FLAG basecamp people clients disable --help type=bool
11802+
FLAG basecamp people clients disable --hints type=bool
11803+
FLAG basecamp people clients disable --ids-only type=bool
11804+
FLAG basecamp people clients disable --in type=string
11805+
FLAG basecamp people clients disable --jq type=string
11806+
FLAG basecamp people clients disable --json type=bool
11807+
FLAG basecamp people clients disable --markdown type=bool
11808+
FLAG basecamp people clients disable --md type=bool
11809+
FLAG basecamp people clients disable --no-hints type=bool
11810+
FLAG basecamp people clients disable --no-stats type=bool
11811+
FLAG basecamp people clients disable --profile type=string
11812+
FLAG basecamp people clients disable --project type=string
11813+
FLAG basecamp people clients disable --quiet type=bool
11814+
FLAG basecamp people clients disable --stats type=bool
11815+
FLAG basecamp people clients disable --styled type=bool
11816+
FLAG basecamp people clients disable --todolist type=string
11817+
FLAG basecamp people clients disable --verbose type=count
11818+
FLAG basecamp people clients enable --account type=string
11819+
FLAG basecamp people clients enable --agent type=bool
11820+
FLAG basecamp people clients enable --cache-dir type=string
11821+
FLAG basecamp people clients enable --count type=bool
11822+
FLAG basecamp people clients enable --help type=bool
11823+
FLAG basecamp people clients enable --hints type=bool
11824+
FLAG basecamp people clients enable --ids-only type=bool
11825+
FLAG basecamp people clients enable --in type=string
11826+
FLAG basecamp people clients enable --jq type=string
11827+
FLAG basecamp people clients enable --json type=bool
11828+
FLAG basecamp people clients enable --markdown type=bool
11829+
FLAG basecamp people clients enable --md type=bool
11830+
FLAG basecamp people clients enable --no-hints type=bool
11831+
FLAG basecamp people clients enable --no-stats type=bool
11832+
FLAG basecamp people clients enable --profile type=string
11833+
FLAG basecamp people clients enable --project type=string
11834+
FLAG basecamp people clients enable --quiet type=bool
11835+
FLAG basecamp people clients enable --stats type=bool
11836+
FLAG basecamp people clients enable --styled type=bool
11837+
FLAG basecamp people clients enable --todolist type=string
11838+
FLAG basecamp people clients enable --verbose type=count
11839+
FLAG basecamp people clients invite --account type=string
11840+
FLAG basecamp people clients invite --agent type=bool
11841+
FLAG basecamp people clients invite --cache-dir type=string
11842+
FLAG basecamp people clients invite --company type=string
11843+
FLAG basecamp people clients invite --count type=bool
11844+
FLAG basecamp people clients invite --help type=bool
11845+
FLAG basecamp people clients invite --hints type=bool
11846+
FLAG basecamp people clients invite --ids-only type=bool
11847+
FLAG basecamp people clients invite --in type=string
11848+
FLAG basecamp people clients invite --jq type=string
11849+
FLAG basecamp people clients invite --json type=bool
11850+
FLAG basecamp people clients invite --markdown type=bool
11851+
FLAG basecamp people clients invite --md type=bool
11852+
FLAG basecamp people clients invite --no-hints type=bool
11853+
FLAG basecamp people clients invite --no-stats type=bool
11854+
FLAG basecamp people clients invite --profile type=string
11855+
FLAG basecamp people clients invite --project type=string
11856+
FLAG basecamp people clients invite --quiet type=bool
11857+
FLAG basecamp people clients invite --stats type=bool
11858+
FLAG basecamp people clients invite --styled type=bool
11859+
FLAG basecamp people clients invite --title type=string
11860+
FLAG basecamp people clients invite --todolist type=string
11861+
FLAG basecamp people clients invite --verbose type=count
11862+
FLAG basecamp people clients list --account type=string
11863+
FLAG basecamp people clients list --agent type=bool
11864+
FLAG basecamp people clients list --cache-dir type=string
11865+
FLAG basecamp people clients list --count type=bool
11866+
FLAG basecamp people clients list --help type=bool
11867+
FLAG basecamp people clients list --hints type=bool
11868+
FLAG basecamp people clients list --ids-only type=bool
11869+
FLAG basecamp people clients list --in type=string
11870+
FLAG basecamp people clients list --jq type=string
11871+
FLAG basecamp people clients list --json type=bool
11872+
FLAG basecamp people clients list --markdown type=bool
11873+
FLAG basecamp people clients list --md type=bool
11874+
FLAG basecamp people clients list --no-hints type=bool
11875+
FLAG basecamp people clients list --no-stats type=bool
11876+
FLAG basecamp people clients list --profile type=string
11877+
FLAG basecamp people clients list --project type=string
11878+
FLAG basecamp people clients list --quiet type=bool
11879+
FLAG basecamp people clients list --stats type=bool
11880+
FLAG basecamp people clients list --styled type=bool
11881+
FLAG basecamp people clients list --todolist type=string
11882+
FLAG basecamp people clients list --verbose type=count
11883+
FLAG basecamp people clients remove --account type=string
11884+
FLAG basecamp people clients remove --agent type=bool
11885+
FLAG basecamp people clients remove --cache-dir type=string
11886+
FLAG basecamp people clients remove --count type=bool
11887+
FLAG basecamp people clients remove --help type=bool
11888+
FLAG basecamp people clients remove --hints type=bool
11889+
FLAG basecamp people clients remove --ids-only type=bool
11890+
FLAG basecamp people clients remove --in type=string
11891+
FLAG basecamp people clients remove --jq type=string
11892+
FLAG basecamp people clients remove --json type=bool
11893+
FLAG basecamp people clients remove --markdown type=bool
11894+
FLAG basecamp people clients remove --md type=bool
11895+
FLAG basecamp people clients remove --no-hints type=bool
11896+
FLAG basecamp people clients remove --no-stats type=bool
11897+
FLAG basecamp people clients remove --profile type=string
11898+
FLAG basecamp people clients remove --project type=string
11899+
FLAG basecamp people clients remove --quiet type=bool
11900+
FLAG basecamp people clients remove --stats type=bool
11901+
FLAG basecamp people clients remove --styled type=bool
11902+
FLAG basecamp people clients remove --todolist type=string
11903+
FLAG basecamp people clients remove --verbose type=count
1174511904
FLAG basecamp people list --account type=string
1174611905
FLAG basecamp people list --agent type=bool
1174711906
FLAG basecamp people list --all type=bool
@@ -18435,6 +18594,13 @@ SUB basecamp notifications list
1843518594
SUB basecamp notifications read
1843618595
SUB basecamp people
1843718596
SUB basecamp people add
18597+
SUB basecamp people clients
18598+
SUB basecamp people clients add
18599+
SUB basecamp people clients disable
18600+
SUB basecamp people clients enable
18601+
SUB basecamp people clients invite
18602+
SUB basecamp people clients list
18603+
SUB basecamp people clients remove
1843818604
SUB basecamp people list
1843918605
SUB basecamp people ooo
1844018606
SUB basecamp people out-of-office

‎API-COVERAGE.md‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ Coverage of Basecamp 3 API endpoints. Source: [bc3-api/sections](https://github.
66

77
| Status | Sections | Endpoints |
88
|--------|----------|-----------|
9-
| ✅ Implemented | 50 | 189 |
9+
| ✅ Implemented | 50 | 192 |
1010
| ⚠️ Blocked | 0 | 0 |
1111
| ⏭️ Out of scope | 4 | 12 |
12-
| **Total tracked** | **54** | **201** |
12+
| **Total tracked** | **54** | **204** |
1313

14-
**189 of 189 tracked in-scope endpoints.** SDK v0.16.0 adds the three to-do
14+
**192 of 192 tracked in-scope endpoints.** The client-admission endpoints
15+
basecamp/bc3#13098 added — `PUT /projects/:id/people/client_users.json` and
16+
`POST`/`DELETE /projects/:id/client_enablement.json` — land as `people clients`.
17+
SDK v0.16.0 adds the three to-do
1518
list template-library operations, available through `templates library`,
1619
`templates copy`, and `templates copy-status`. The previous last gap — `GET
1720
/uploads/:id/versions.json` — closed with the v0.14.0 SDK bump. The command
@@ -211,7 +214,7 @@ cannot faithfully cover at least one endpoint for a reason outside the CLI. A
211214
| drafts | 1 | `drafts` | ✅ | BC5 | - | list unpublished drafts across projects (server caps at 250). Bounded like the account-wide listings; publishing happens through the command for the draft's type |
212215
| my_notes | 2 | `notes` | ✅ | BC5 | - | show, set. A singleton per person, so no id and no listing. Pre-first-write the record does not exist yet and renders as empty rather than 404. `set` writes Markdown as HTML; attachments are out of scope |
213216
| **People** |
214-
| people | 12 | `people`, `me` | ✅ | BC4 | - | list, show, update (edit your own profile via `PUT /my/profile.json`), out-of-office show/set/clear (`GetOutOfOffice`/`EnableOutOfOffice`/`DisableOutOfOffice`), pingable, add, remove (BC5: `tagline` alias of `bio` on person output) |
217+
| people | 15 | `people`, `me` | ✅ | BC4 | - | list, show, update (edit your own profile via `PUT /my/profile.json`), out-of-office show/set/clear (`GetOutOfOffice`/`EnableOutOfOffice`/`DisableOutOfOffice`), pingable, add, remove (BC5: `tagline` alias of `bio` on person output). `people clients` covers the client side: `add`/`remove`/`invite` through `PUT /projects/:id/people/client_users.json` (basecamp/bc3#13098), `enable`/`disable` through `POST`/`DELETE /projects/:id/client_enablement.json`; `list` is the project roster filtered to `client: true` |
215218
| **Search & Recordings** |
216219
| my_assignments | 6 | `assignments` | ✅ | BC4 | - | list (priorities/non-priorities), completed, due (with scope filter), prioritize, deprioritize, reorder. `list` surfaces `priority_recording_id`, which is the only way to address a prioritized card-table step — it appears in no URL |
217220
| search | 2 | `search` | ✅ | BC4 | - | Full-text search + metadata. Filters: `--project`/`--in`, `--type`, `--creator`, `--since` (BC5-only), `--file-type`, `--exclude-chat`. Metadata lists recording/file search types |

‎e2e/people.bats‎

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#!/usr/bin/env bats
2+
# people.bats - people command error handling (offline: every case resolves
3+
# locally, before any request)
4+
5+
load test_helper
6+
7+
8+
# Help
9+
10+
@test "people clients without subcommand shows help" {
11+
run basecamp people clients
12+
assert_success
13+
assert_output_contains "COMMANDS"
14+
}
15+
16+
17+
# Missing context errors
18+
19+
@test "people clients list without project shows error" {
20+
create_credentials
21+
create_global_config '{"account_id": 99999}'
22+
23+
run basecamp people clients list --json
24+
assert_failure
25+
assert_json_value '.code' 'usage'
26+
assert_json_value '.error' '--project (or --in) is required'
27+
}
28+
29+
@test "people clients add without ids shows error" {
30+
create_credentials
31+
create_global_config '{"account_id": 99999, "project_id": 123}'
32+
33+
run basecamp people clients add --json
34+
assert_failure
35+
assert_json_value '.code' 'usage'
36+
assert_json_value '.error' '<id|email|name>... required'
37+
}
38+
39+
40+
# Invitee parsing
41+
42+
@test "people clients invite rejects a token that is not an address" {
43+
create_credentials
44+
create_global_config '{"account_id": 99999, "project_id": 123}'
45+
46+
run basecamp people clients invite "Annie Bryan" --json
47+
assert_failure
48+
assert_json_value '.code' 'usage'
49+
assert_json_value '.error | contains("Name <email>")' 'true'
50+
}
51+
52+
@test "people clients invite - with empty pipe is a usage error" {
53+
create_credentials
54+
create_global_config '{"account_id": 99999, "project_id": 123}'
55+
56+
run bash -c "printf '' | basecamp people clients invite - --json"
57+
assert_failure
58+
assert_json_value '.code' 'usage'
59+
assert_output_contains "empty"
60+
}
61+
62+
@test "people clients invite - mixed with other invitees is rejected" {
63+
create_credentials
64+
create_global_config '{"account_id": 99999, "project_id": 123}'
65+
66+
run bash -c "printf 'a@example.com' | basecamp people clients invite - b@example.com --json"
67+
assert_failure
68+
assert_json_value '.code' 'usage'
69+
assert_output_contains "cannot be combined"
70+
}
71+
72+
@test "people clients invite --title with several invitees is rejected" {
73+
create_credentials
74+
create_global_config '{"account_id": 99999, "project_id": 123}'
75+
76+
run basecamp people clients invite a@example.com b@example.com --title Owner --json
77+
assert_failure
78+
assert_json_value '.code' 'usage'
79+
assert_output_contains "--title"
80+
}

‎e2e/smoke/smoke_lifecycle.bats‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,26 @@ load smoke_helper
137137
mark_out_of_scope "Modifies project membership"
138138
}
139139

140+
@test "people clients add is out of scope" {
141+
mark_out_of_scope "Modifies project membership"
142+
}
143+
144+
@test "people clients remove is out of scope" {
145+
mark_out_of_scope "Modifies project membership"
146+
}
147+
148+
@test "people clients invite is out of scope" {
149+
mark_out_of_scope "Invites a new client by email — consumes an account seat"
150+
}
151+
152+
@test "people clients enable is out of scope" {
153+
mark_out_of_scope "Reconfigures project-wide client visibility"
154+
}
155+
156+
@test "people clients disable is out of scope" {
157+
mark_out_of_scope "Reconfigures project-wide client visibility"
158+
}
159+
140160
@test "todos sweep is out of scope" {
141161
mark_out_of_scope "Bulk completion — destructive, no undo"
142162
}

‎e2e/smoke/smoke_projects.bats‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ setup_file() {
3131
echo "$output" | jq -r '.data[0].id' > "$BATS_FILE_TMPDIR/project_id"
3232
}
3333

34+
@test "people clients list returns the project's clients" {
35+
local proj_file="$BATS_FILE_TMPDIR/project_id"
36+
[[ -f "$proj_file" ]] || mark_unverifiable "projects list did not produce a project ID"
37+
local proj_id
38+
proj_id=$(<"$proj_file")
39+
40+
run_smoke basecamp people clients list --in "$proj_id" --json
41+
assert_success
42+
assert_json_value '.ok' 'true'
43+
assert_json_value '.data | type' 'array'
44+
}
45+
3446
@test "projects show returns project detail" {
3547
local proj_file="$BATS_FILE_TMPDIR/project_id"
3648
[[ -f "$proj_file" ]] || mark_unverifiable "projects list did not produce a project ID"

‎go.mod‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
charm.land/bubbles/v2 v2.2.1
77
charm.land/bubbletea/v2 v2.0.9
88
charm.land/lipgloss/v2 v2.0.6
9-
github.com/basecamp/basecamp-sdk/go v0.16.1-0.20260903193203-47e7ca381a49
9+
github.com/basecamp/basecamp-sdk/go v0.17.0
1010
github.com/basecamp/cli v0.2.2-0.20260828230226-767413fc712d
1111
github.com/basecamp/mcp v0.0.0-20260828100356-2d6f44b51e9d
1212
github.com/basecamp/surfguard/go v0.1.0

‎go.sum‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ github.com/aymanbagabas/go-udiff v0.4.1 h1:OEIrQ8maEeDBXQDoGCbbTTXYJMYRCRO1fnodZ
8787
github.com/aymanbagabas/go-udiff v0.4.1/go.mod h1:0L9PGwj20lrtmEMeyw4WKJ/TMyDtvAoK9bf2u/mNo3w=
8888
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
8989
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
90-
github.com/basecamp/basecamp-sdk/go v0.16.1-0.20260903193203-47e7ca381a49 h1:acgFif/siLT3R1/XWHdXLGGsE4x7HqKCvSaXw6j7xHo=
91-
github.com/basecamp/basecamp-sdk/go v0.16.1-0.20260903193203-47e7ca381a49/go.mod h1:Cs9DV8iRJaVT4+IQXGZTeyG2nQAV2kQda7GHuBOeonY=
90+
github.com/basecamp/basecamp-sdk/go v0.17.0 h1:u2kIDtr7bmHXLSkF61HXkLDymQdwoI+pzbT0F6OwHYM=
91+
github.com/basecamp/basecamp-sdk/go v0.17.0/go.mod h1:Cs9DV8iRJaVT4+IQXGZTeyG2nQAV2kQda7GHuBOeonY=
9292
github.com/basecamp/cli v0.2.2-0.20260828230226-767413fc712d h1:jAzDrCCzDpIwhbFT1xVVs0z2xpXoDEkomHfKB2bUUp8=
9393
github.com/basecamp/cli v0.2.2-0.20260828230226-767413fc712d/go.mod h1:iTBTaWvsPEFIcZfkxQHEfISyJ6sZ7036K6bNx0RY3EE=
9494
github.com/basecamp/mcp v0.0.0-20260828100356-2d6f44b51e9d h1:zEQVGq1x1nhKMZ2TudFAcSJ32CHT8richI1vQakIKz4=

‎internal/commands/commands.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func CommandCategories() []CommandCategory {
8888
{
8989
Name: "Organization",
9090
Commands: []CommandInfo{
91-
{Name: "people", Category: "organization", Description: "Manage people and access", Actions: []string{"list", "show", "update", "out-of-office", "pingable", "add", "remove"}},
91+
{Name: "people", Category: "organization", Description: "Manage people and access", Actions: []string{"list", "show", "update", "out-of-office", "pingable", "add", "remove", "clients"}},
9292
{Name: "templates", Category: "organization", Description: "Manage project and to-do list templates", Actions: []string{"list", "show", "create", "update", "delete", "construct", "construction", "library", "copy", "copy-status"}},
9393
{Name: "webhooks", Category: "organization", Description: "Manage webhooks", Actions: []string{"list", "show", "create", "update", "delete"}},
9494
{Name: "lineup", Category: "organization", Description: "Manage lineup markers", Actions: []string{"list", "create", "update", "delete"}},

0 commit comments

Comments
 (0)