Withdraw account-wide boost listing (bc3 #12464) - #591
Conversation
BC5 is withdrawing GET /:account/boosts.json — the query costs ~44s on the largest account, and this CLI was its only known consumer. Once the bc3 change deploys, the path 404s, so the two routes to it go before v0.8.0 stable: `boost list --all-projects` and the bare `boost list` account-wide fallback. `boost list` is item-scoped only now. The arg stays optional so a bare invocation gets a friendly usage hint (carrying an explicit project forward) instead of a cobra arity error, and the surface keeps `[id|url]` — when bc3 #12463 reintroduces the feed on a boost-proportional query, the bare form slots back with zero arg churn. The flag removals are acknowledged in .surface-breaking against v0.8.0-rc.1. The other seven account-wide listings, recording-scoped `boost list <id>`, and `boost create` are untouched, as is the SDK's GetEverythingBoosts (pulling it would churn every client twice for a temporary withdrawal).
Review carefully before merging. Consider a major version bump. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4e88f2cf90
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| the 17 are reached from the CLI — `Boosts` lost its upstream endpoint when the | ||
| account-wide boost feed was withdrawn (bc3 #12464; reintroduction tracked in | ||
| bc3 #12463) — see [Account-wide |
There was a problem hiding this comment.
Correct the remaining full-coverage claims
After removing the only CLI route to EverythingService.Boosts, this paragraph correctly says only 16 of 17 methods are reachable, but the same document still claims that the service is “fully reached” at lines 15–17 and that “All 17 methods are reachable” at lines 68–69. This leaves the API coverage document internally contradictory and overstates SDK parity; update those remaining claims to describe the Boosts exception.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
This PR removes the CLI’s account-wide boost list behavior and the --all-projects flag to avoid calling the soon-to-be-withdrawn BC5 endpoint (GET /:account/boosts.json), keeping boost list item-scoped only and updating docs/surface tracking accordingly.
Changes:
- Remove
boost listaccount-wide fallback +--all-projectsflag; keepboost listitem-scoped and return a usage hint on bare invocation. - Update unit tests to assert bare
boost listis a usage error and makes no API requests; remove now-obsolete account-wide route stubs/tests. - Update docs and CLI surface metadata to reflect the removal (SKILL.md, ACCOUNT-WIDE-LISTINGS.md, API-COVERAGE.md,
.surface,.surface-breaking).
Tip
If you aren't ready for review, convert to a draft PR.
Click "Convert to draft" or run gh pr ready --undo.
Click "Ready for review" or run gh pr ready to reengage.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
internal/commands/boost.go |
Removes account-wide boost listing + --all-projects; makes boost list item-scoped and returns a usage hint when no ID is provided. |
internal/commands/boost_test.go |
Reworks boost list tests around the new “usage error, no API call” behavior; deletes account-wide listing tests. |
internal/commands/accountwide_test.go |
Drops boost from account-wide listing todolist rejection coverage since it no longer has an account-wide path. |
skills/basecamp/SKILL.md |
Updates documentation to reflect 7 (not 8) account-wide list commands. |
ACCOUNT-WIDE-LISTINGS.md |
Updates the method matrix/invariants to reflect removal of the account-wide boost aggregate. |
API-COVERAGE.md |
Updates EverythingService coverage note/matrix to reflect 16/17 reachable methods due to boost feed withdrawal. |
.surface |
Removes --all-projects from basecamp boost(s) list. |
.surface-breaking |
Records the removed --all-projects flags as acknowledged breaking surface changes. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| if recording == "" { | ||
| switch { | ||
| case explicitProject != "" && allProjects: | ||
| return output.ErrUsageHint("Cannot combine --all-projects with --project", | ||
| "--all-projects lists boosts from every project; drop --project, or pass an item ID to list one item's boosts") | ||
| case explicitProject != "": | ||
| return output.ErrUsageHint("Boosts belong to an item, so --project alone cannot list them", | ||
| fmt.Sprintf("Pass the item's ID or URL: basecamp boost list <id> --project %s", explicitProject)) | ||
| hint := "Pass the item's ID or URL: basecamp boost list <id>" | ||
| explicitProject := project | ||
| if explicitProject == "" { | ||
| explicitProject = app.Flags.Project |
Why
BC5 is withdrawing
GET /:account/boosts.json(basecamp/bc3#12464; diagnosis basecamp/bc3#12458): the query costs ~44s on the largest account, and this CLI was its only known consumer (~2,250 req/30d globally). Once that deploys, the path 404s. The withdrawal is temporary — reintroduction on a boost-proportional query is tracked in basecamp/bc3#12463 — so this removes the CLI's two routes to the endpoint before v0.8.0 stable, reverting one command's slice of the #584 surface that shipped in v0.8.0-rc.1.What
boost listis item-scoped only: the--all-projectsflag and the bare-invocation account-wide fallback are gone, along withrunBoostListAccountWideandflattenAccountWideBoosts.MaximumNArgs(1), surface keeps[id|url]): a bareboost listgets a usage hint — carrying an explicit--projectforward into the corrected invocation — instead of a cobra arity error. When bc3 #12463 brings the feed back, the bare form slots back in with zero arg churn..surface-breaking, socheck-surface-compatpasses against v0.8.0-rc.1.Untouched: the other seven account-wide listings and shared
accountwide.gohelpers, recording-scopedboost list <id>/--event,boost create/show/delete, the TUI boost picker, and the SDK (GetEverythingBoostsstays; pulling it would churn every client twice for a temporary withdrawal).Tests
TestBoostListWithoutIDIsUsageError(the withdrawn behavior's replacement) plus rewrites for the configured-project, explicit-project, and--eventbare-list paths — all shown red against the unmodified code first, and all assert no request reaches the API.boostfromTestAccountWideListingsRejectRootTodolist(bareboost listno longer reaches the todolist rejection).go test ./internal/commands/,make check,make check-surface-compat, andmake test-e2eall pass; manual: bareboost list→ hint,--all-projects→ unknown flag.Timing: land before or with v0.8.0 stable (bc3 #12464 still open as of 2026-07-30, expected to merge shortly).
Summary by cubic
Withdraws the account‑wide boost feed;
basecamp boost listis now item‑scoped only. Removes--all-projectsand replaces the bare invocation with a clear usage hint.--all-projectsfrombasecamp boost list/basecamp boosts list; pass an item ID or URL instead:basecamp boost list <id|url> [--project <project>].boost listnow errors with a hint; it no longer lists across projects.--eventstill works but requires an item ID.Written for commit 4e88f2c. Summary will update on new commits.