Skip to content

Add basecamp boost update - #917

Merged
robzolkos merged 3 commits into
mainfrom
boost-update-cmd
Oct 20, 2026
Merged

robzolkos merged 3 commits into
mainfrom
boost-update-cmd

Conversation

@robzolkos

@robzolkos robzolkos commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

What

basecamp boost update <boost-id|url> <content> (and boosts update) changes the content of a boost you gave. It calls the SDK's BoostsService.Update (PUT /boosts/{id}).

  • Content is a short note, 16 characters max, counted in characters not bytes. boost create and boost update share one helper (checkBoostLength), and the check runs before any request is made.
  • Blank content is refused locally ("Boost content required").
  • - as the content reads it from stdin, as create does.
  • A boost ID or a boost URL is accepted (.../boosts/789, parsed the way show and delete parse it). The route is flat, so no project or item is needed; the boost ID is the whole address.
  • Only the boost's creator can update it. Anyone else, admins included, gets the server's 403, which comes back through the usual error mapping (404 and 422 too).
  • Output matches create: the updated boost, a summary (Updated boost #N to <content>), and breadcrumbs to show and delete it.
  • Catalog entry, .surface, API-COVERAGE.md boosts row (6 to 7 operations), and a live smoke test. skills/basecamp/SKILL.md documents no boost commands, so it is unchanged. The basecamp-connect skill is untouched.

SDK dependency

Needs UpdateBoost from basecamp-sdk #1016 (head 32567741, which contains #1015). Until that releases, the bottom DO NOT MERGE commits point the replace at a local SDK worktree. Drop them and run make bump-sdk once it ships. This PR is stacked on #914.

Compatibility check (final SDK vs the provisional CLI stack)

With the replace pointed at the #1016 SDK, make check (what bin/ci runs) at the replace commit alone (#913/#914 code, nothing of this PR) exits 0: fmt, vet, lint, lint-actions, go unit tests (-tags dev ./...), BATS e2e, sync-skills, naming, surface, skill drift, bare groups, lint lockstep, smoke coverage, eval checks, race shards, tidy. Only the SDK provenance check skips, as expected with a replace active. The final SDK broke nothing in #913/#914.

Tests

New tests in internal/commands/boost_test.go (all red against the old boost.go, green now): sends new content and summary, boosts alias, URL form, stdin, over 16 refused before any request, exactly 16 accepted, 16 emoji accepted (characters, not bytes), empty and blank refused before any request, bad ID refused before any request, 403/404/422 mapping.

make check on the PR head also exits 0.

Live check

Against production, on the R2-D2 Ping line (bucket 49282878, line 10420899410), as the logged-in profile (R2-D2), self-cleaning: boost create with 👀, boost update to ✅ done, boost show confirmed ✅ done, an over-cap update was refused locally, a stdin update (-) worked, then boost delete. The line's one pre-existing boost was untouched.


Summary by cubic

Adds basecamp boost update <boost-id|url> <content> (and boosts update) to change the content of a boost you gave, via the SDK's UpdateBoost (PUT /boosts/{id}).

  • Content follows the same 16-character cap as boost create, checked before any request through one shared helper; blank content is refused locally, and - reads content from stdin.
  • Accepts a boost ID or URL, but the URL must be on a trusted Basecamp host, name exactly one boost, and belong to the configured account — anything else is refused before a request is sent.
  • Only the boost's creator can update it; the server's 403, 404, and 422 errors map through the usual error handling.
  • Output matches create: the updated boost, a summary, and breadcrumbs to show and delete it.
  • Updates the catalog entry, .surface, API-COVERAGE.md (boosts row 6 to 7), and adds a live smoke test.

Dependencies

Depends on the SDK's UpdateBoost (basecamp-sdk#1016); the bottom DO NOT MERGE commits point the replace at a local SDK worktree. Drop them and run make bump-sdk once the SDK ships.

Written for commit 8fff68c. Summary will update on new commits.

View guided diff Turn on auto-fix

@github-actions github-actions Bot added commands CLI command implementations tests Tests (unit and e2e) docs deps labels Oct 19, 2026
@github-actions github-actions Bot removed the deps label Oct 20, 2026
@robzolkos
robzolkos force-pushed the boost-update-cmd branch 2 times, most recently from 973e182 to 9f7d876 Compare October 20, 2026 01:56
@robzolkos
robzolkos force-pushed the connect-pings branch 2 times, most recently from 25f7263 to e121261 Compare October 20, 2026 02:02
@robzolkos
robzolkos force-pushed the boost-update-cmd branch 2 times, most recently from 78fe691 to 882a6a1 Compare October 20, 2026 02:22
Base automatically changed from connect-pings to main October 20, 2026 02:30
Changes the content of a boost the caller gave, through the SDK's
BoostsService.Update (PUT /boosts/{id}). Takes a boost id or URL and the
new content, or - to read it from stdin. The same 16-character cap as
create is checked before any request, through one shared helper, and
blank content is refused locally. Only a boost's creator can update it;
the server's 403, 404 and 422 come back through the usual error mapping.

Depends on the SDK's UpdateBoost (basecamp-sdk#1016), reached here
through the DO NOT MERGE replace beneath this commit.
@robzolkos
robzolkos marked this pull request as ready for review October 20, 2026 02:30
@robzolkos
robzolkos requested a review from a team as a code owner October 20, 2026 02:30
Copilot AI balanced review requested due to automatic review settings October 20, 2026 02:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

URL identity validation and shell-safe breadcrumb quoting need correction before approval.

2 open issues
What changed in this PR

Adds basecamp boost update and its boosts alias to edit existing reactions through the SDK.

Changes:

  • Adds update handling with stdin support and shared length validation.
  • Adds unit and live smoke coverage.
  • Updates the command catalog, surface snapshot, and API coverage.

[!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.

File Description
internal/​commands/​commands.go Registers the update action.
internal/​commands/​boost.go Implements update and shared length validation.
internal/​commands/​boost_test.go Tests input handling, requests, and errors.
e2e/​smoke/​smoke_communication_write.bats Adds a live update smoke test.
API-COVERAGE.md Documents the seventh boost operation.
.surface Records update commands, arguments, and flags.

Review effort: Balanced

Comment thread internal/commands/boost.go Outdated
Comment thread internal/commands/boost.go Outdated
boost update took a URL's boost and project IDs and dropped the rest, so a
URL from another account updated the boost with that ID in the configured
one, and a URL naming a to-do, a recording's boost list or another host
was read as a boost. The URL must now be on a Basecamp host and name one
boost, checked before content is read, and its account must match the
configured one, checked before anything is sent. The show breadcrumb
quotes its project for the shell.
Copilot AI balanced review requested due to automatic review settings October 20, 2026 02:42

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approved

No unresolved blocking issues remain in the reviewed changes, and regression tests cover the previously reported problems.

No open issues 🎉

2 resolved since last review

Review effort: Balanced

@robzolkos
robzolkos merged commit b0abd91 into main Oct 20, 2026
32 checks passed
@robzolkos
robzolkos deleted the boost-update-cmd branch October 20, 2026 02:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

commands CLI command implementations docs tests Tests (unit and e2e)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants