You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Set, lay out and remove a project's wallpaper - #948
Upload or replace PNG, JPEG, GIF, WebP, AVIF, HEIF or HEIC files up to 10 MB. Local checks use the file size and MIME hint; the server applies its existing shared image validations.
Change fill/tile through project update, resending the current name as required by the SDK. Omitted upload mode preserves the current setting, including a setting saved before an image exists.
Remove an image idempotently. Commands return the project; .data.wallpaper is {url, mode} when attached and otherwise absent. The URL requires authentication and redirects to the image; it is not a public image link.
Show the wallpaper mode in Markdown/styled project details. Update skill guidance, eval coverage, API coverage and command surface.
People and personal assistants follow project-edit permissions; shared agents are refused.
This covers the wallpaper half of #864. Project color and logo remain out of scope.
Dependencies and rebase
Rebased onto current main, replacing the obsolete SDK feature-branch pin with released SDK v0.28.0. BC3 #14062 is merged and deployed, and SDK #1037 is merged and released.
SDK provenance, the vendored MCP model/catalog snapshot and the Nix vendor hash are refreshed. MCP exposes remove_project_wallpaper; multipart upload remains excluded like the other binary uploads.
Full local bin/ci passes, including unit/e2e tests, linting, surface/skill drift, SDK provenance and dependency tidiness.
The Nix build succeeds with the updated vendor hash.
Built the local CLI against published Go SDK v0.28.0 and ran 28/28 production checks on the operator-supplied test project, sequentially:
upload/read-back in all seven supported image formats;
replacements, changed attachment URLs and omitted-mode preservation;
explicit fill/tile, mode without an image, and the next upload retaining that mode;
--in/--project selection and JSON/Markdown/styled output, plus executing the advertised scoped show command and checking every wallpaper breadcrumb preserves the explicit account;
local argument/type/size rejections and a server 422 for SVG mislabeled as PNG, preserving the previous image;
removal, re-read and repeated removal.
Cleanup verified the original mode with an omitted-mode upload, then restored wallpaper absence and confirmed the project name was unchanged. An independent installed-CLI read also confirmed absence.
The new seven-format regression test fails against the old implementation for GIF, HEIF and HEIC, then passes with the fix.
FixedCopilot's scope finding using the existing newFollowUpScope pattern before account resolution. Twelve regression cases cover all three wallpaper commands across configured account, active profile, explicit account override and prompted account contexts; they fail before the fix and pass afterward.
Addressed Copilot's macOS portability finding: the oversized BATS fixture now uses portable dd, not GNU truncate. Its targeted test passes with truncate forced unavailable. No macOS execution is claimed; the full local gate ran on Linux.
The previous description's blanket claim that every mislabeled file is rejected was incorrect: existing image identification can accept plain text named .png. This PR deliberately retains the shared server policy rather than adding a stricter decoder/format policy in the CLI.
Cubic's neutral quota result is not a substantive code review. Copilot's earlier exhausted-credit response was not a review either; it subsequently reviewed the rebased code and found the scope issue fixed above. Fresh GitHub checks/reviews are tracked on this head; this update does not merge the PR.
The reason will be displayed to describe this comment to others. Learn more.
Copilot was unable to review this pull request because the organization has exhausted its available GitHub AI Credits or reached a budget that stops additional usage. An organization owner can increase the applicable AI Credits budget or wait for the usage allowance to reset. Learn about budgets for usage-based billing. Review the organization's AI Credits budgets.
🤖 Reviewed at 53a29b6. The code is clean. CI is green apart from Copilot's check, which failed because the organization's AI credits ran out, so no bot has reviewed this PR. I checked:
Every local refusal happens before the upload, and the tests assert that no request was sent.
The type check uses the file extension, with byte sniffing as a fallback. The server's own sniffing catches a mislabeled file, as the PR says.
mode sends back exactly {name, wallpaper_mode}, so the description isn't touched.
When the read-back fails, the command reports it as a diagnostic instead of failing a change that already happened.
The .surface entries, the skill section, and the eval case match the commands.
What's left is the merge state, not the code:
It conflicts with main in go.mod, go.sum and nix/package.nix, because main has moved both the SDK and basecamp/cli pins since this branch was cut.
It still pins an SDK branch pseudo-version and depends on bc3#14062, so if it merged today, `set` and `remove` would call an endpoint production doesn't have yet.
I'd mark it draft until basecamp-sdk#1037 and bc3#14062 land, then re-bump, re-sync the MCP model and refresh the Nix hash, as the description already plans.
🤖 Local review at 53a29b6 against main, in place of the Copilot pass that didn't run: no regressions found. The wallpaper tests, the presenter and MCP suites, and the 9 project e2e tests pass. Live API smoke tests weren't run.
What the earlier comment raised still stands: the conflicts with main in go.mod, go.sum and nix/package.nix, the pinned SDK branch, and the dependency on basecamp-sdk#1037 and bc3#14062.
basecamp projects wallpaper set <file> [--mode fill|tile]
basecamp projects wallpaper mode <fill|tile>
basecamp projects wallpaper remove
The project comes from --project/--in, then the configured default, as
for other project-scoped commands; the positional slot is the file or
the mode. Before anything is sent, set refuses a file that is not PNG,
JPEG, WebP or AVIF or is over 10 MB, and both set and mode refuse a mode
other than fill or tile. The formats and the cap are named once and feed
the help and the refusals. The server sniffs the bytes and holds the
web's rules (editors only, agents refused), and its 422 or 403 comes
back as the error.
mode goes through PUT /projects/:id.json with wallpaper_mode, sending the
current name the SDK requires and nothing else. Each command answers
with the project re-read, so the output shows wallpaper {url, mode}, or
no wallpaper after remove; a failed re-read falls back with a notice,
since the change has already happened.
The skill says which commands change a wallpaper and what an agent
cannot learn from leaf help in time: an agent profile is always refused,
so retrying or reaching for basecamp api is wrong. An eval case holds
that the agent uses wallpaper set rather than projects update.
API-COVERAGE gains a BC5 projects (wallpaper) row for the two new
endpoints, and the totals move from 209 to 211.
Styled and Markdown project output listed no wallpaper, so a person
running projects show or a wallpaper command saw nothing of it. Show
the mode under Info when one is attached. The URL is a signed-in
redirect, no use to read in a terminal, so it stays in JSON only.
Use portable dd instead of truncate for macOS e2e fixture
e2e/projects.bats:51
This adds a truncate dependency to make test-e2e, but macOS does not provide that command and the macOS setup documented in CONTRIBUTING.md does not install GNU coreutils. On that supported setup, this test fails while creating its fixture, so bin/ci cannot pass. Create the 10 MiB + 1 byte file with portable dd instead.
Rebased and pushed ea21e610. The conflicts and dependency blockers raised in the earlier review and follow-up are resolved: the API is deployed, SDK v0.28.0 is released and pinned, and provenance/MCP/Nix metadata are refreshed.
Full local bin/ci passes. Nix build verified with the updated vendor hash.
28/28 live checks pass with the locally built CLI, including all seven image formats, replacement/mode preservation, output, scoped follow-up execution, local/server rejections and idempotent removal. Original wallpaper absence/mode restored and name unchanged; an independent installed-CLI read confirmed absence.
Fixed the scope finding with the shared scope helper and 12 red/green regression cases; its thread is resolved.
Fixed the review-body portability finding with portable dd; the targeted BATS test also passes when truncate is forced unavailable. No macOS execution is claimed.
Current-head GitHub results: 36/41 successful, 4 skipped, 1 neutral; no failures or pending checks. Copilot reviewed this exact head and reports no open issues. 0/1 review threads unresolved; the review-body finding is answered above. Cubic is quota-limited: its neutral check is not a substantive review.
The old blanket claim about rejecting every mislabeled file has been removed. Local checks use a MIME hint and the deployed server keeps its shared image-identification/validation policy; this change does not introduce a stricter CLI decoder.
PR remains open, mergeable and unmerged; auto-merge is off.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
commandsCLI command implementationsdepsdocsoutputOutput formatting and presentationsdkSDK wrapper and provenanceskillsAgent skillstestsTests (unit and e2e)
3 participants
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds
basecamp projects wallpaper set|mode|remove:fill/tilethrough project update, resending the current name as required by the SDK. Omitted upload mode preserves the current setting, including a setting saved before an image exists..data.wallpaperis{url, mode}when attached and otherwise absent. The URL requires authentication and redirects to the image; it is not a public image link.This covers the wallpaper half of #864. Project color and logo remain out of scope.
Dependencies and rebase
Rebased onto current
main, replacing the obsolete SDK feature-branch pin with released SDK v0.28.0. BC3 #14062 is merged and deployed, and SDK #1037 is merged and released.SDK provenance, the vendored MCP model/catalog snapshot and the Nix vendor hash are refreshed. MCP exposes
remove_project_wallpaper; multipart upload remains excluded like the other binary uploads.Verification
Updated head: ea21e610.
bin/cipasses, including unit/e2e tests, linting, surface/skill drift, SDK provenance and dependency tidiness.v0.28.0and ran 28/28 production checks on the operator-supplied test project, sequentially:--in/--projectselection and JSON/Markdown/styled output, plus executing the advertised scopedshowcommand and checking every wallpaper breadcrumb preserves the explicit account;newFollowUpScopepattern before account resolution. Twelve regression cases cover all three wallpaper commands across configured account, active profile, explicit account override and prompted account contexts; they fail before the fix and pass afterward.dd, not GNUtruncate. Its targeted test passes withtruncateforced unavailable. No macOS execution is claimed; the full local gate ran on Linux.The previous description's blanket claim that every mislabeled file is rejected was incorrect: existing image identification can accept plain text named
.png. This PR deliberately retains the shared server policy rather than adding a stricter decoder/format policy in the CLI.Cubic's neutral quota result is not a substantive code review. Copilot's earlier exhausted-credit response was not a review either; it subsequently reviewed the rebased code and found the scope issue fixed above. Fresh GitHub checks/reviews are tracked on this head; this update does not merge the PR.