Title-only update silently wipes description
Running basecamp todos update <id> --title "..." clears the todo's existing description, even though --description was never passed.
Why it matters: This is data loss with no warning. The CLI returns {"ok": true, "summary": "Updated todo #..."} and exits 0 while the entire description disappears on Basecamp's side (reproduced with a ~2 KB body). Recovery via the CLI is also broken (see below), so users have to restore manually from a backup in the web UI.
Steps to reproduce:
- Find a todo with a non-empty description:
basecamp todos show <id> --json --quiet | jq -r '.description'
- Update only the title:
basecamp todos update <id> --title "New title"
- Re-fetch:
basecamp todos show <id> --json --quiet | jq -r '.description' → empty string.
Expected: title changes, description preserved.
Actual: title changes, description is now "". The web UI confirms the body is gone. The update response payload itself shows "description": "", which suggests the CLI sends an empty description on every PATCH instead of omitting fields not passed on the command line.
Recovery is also broken in 0.7.2:
basecamp todos update <id> --description "anything" returns {"ok": true, "summary": "Updated todo #<id>"} with exit 0, but updated_at does not advance and description stays empty in show. Reproduced with both a ~2 KB multi-line markdown blob and a one-line value. The PATCH never lands.
Environment: basecamp 0.7.2, macOS (darwin 24.3.0).
Related: #420 (cards update --body silently discards HTML content) — same shape: unspecified fields sent as empty rather than omitted from the PATCH.
Title-only update silently wipes description
Running
basecamp todos update <id> --title "..."clears the todo's existingdescription, even though--descriptionwas never passed.Why it matters: This is data loss with no warning. The CLI returns
{"ok": true, "summary": "Updated todo #..."}and exits 0 while the entire description disappears on Basecamp's side (reproduced with a ~2 KB body). Recovery via the CLI is also broken (see below), so users have to restore manually from a backup in the web UI.Steps to reproduce:
basecamp todos show <id> --json --quiet | jq -r '.description'basecamp todos update <id> --title "New title"basecamp todos show <id> --json --quiet | jq -r '.description'→ empty string.Expected: title changes, description preserved.
Actual: title changes, description is now
"". The web UI confirms the body is gone. Theupdateresponse payload itself shows"description": "", which suggests the CLI sends an emptydescriptionon every PATCH instead of omitting fields not passed on the command line.Recovery is also broken in 0.7.2:
basecamp todos update <id> --description "anything"returns{"ok": true, "summary": "Updated todo #<id>"}with exit 0, butupdated_atdoes not advance anddescriptionstays empty inshow. Reproduced with both a ~2 KB multi-line markdown blob and a one-line value. The PATCH never lands.Environment:
basecamp 0.7.2, macOS (darwin 24.3.0).Related: #420 (
cards update --body silently discards HTML content) — same shape: unspecified fields sent as empty rather than omitted from the PATCH.