diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index aac4734f..44dc1831 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -431,6 +431,71 @@ basecamp todos sweep --overdue --complete --comment "Done" --in **Flags:** `--assignee` (todos only - not available on cards/messages), `--status` (completed/incomplete/archived/trashed), `--overdue`, `--list`, `--due`, `--limit`, `--all` +**Todo Subtasks (checklist steps):** Basecamp to-do subtasks are stored as +`Kanban::Step` records, even when their parent is a normal `Todo`. The regular +`todos show` response may not include them; use +`basecamp recordings list --type Kanban::Step` and filter by `parent.id` to +list/check subtasks for a todo. + +```bash +# Create a subtask under a todo. Use the todo ID in this card-style path. +basecamp api post /buckets//card_tables/cards//steps.json \ + --data '{"title":"Subtask title"}' \ + --json + +# Read or edit a subtask +basecamp api get /buckets//card_tables/steps/.json --json +basecamp api put /buckets//card_tables/steps/.json \ + --data '{"title":"Updated subtask title"}' \ + --json + +# List subtasks for a todo +PARENT_TODO_ID= \ +basecamp recordings list --in --type Kanban::Step --all --json \ + --jq '.data[] | select(.parent.id==(env.PARENT_TODO_ID | tonumber)) | {id,title,status,parent:.parent.id,url}' + +# Assign or set a due date. Include the current title when updating metadata. +basecamp api put /buckets//card_tables/steps/.json \ + --data '{"title":"Current subtask title","assignee_ids":[],"due_on":""}' \ + --json + +# Complete or reopen a subtask +basecamp api put /buckets//card_tables/steps//completions.json \ + --data '{"completion":"on"}' \ + --json +basecamp api put /buckets//card_tables/steps//completions.json \ + --data '{"completion":"off"}' \ + --json + +# Trash a subtask from the todo UI by trashing the step record (Kanban::Step) +basecamp recordings trash --in --json +``` + +Key points: replace numeric placeholders such as `` and +`` before running the examples. For creating todo subtasks, Basecamp +accepts the parent todo ID in the `/card_tables/cards//steps.json` +path. To list subtasks under a todo, use +`basecamp recordings list --type Kanban::Step` with the `parent.id` filter shown +above. + +Completed subtasks have `completed: true` and a `completion` object with +`created_at` and `creator`. Open subtasks have `completed: false` and no +`completion` object. Trashed subtasks may still be readable directly with +`status: "trashed"` and `inherits_status: false`, but they no longer appear in +the todo UI. + +In testing with todo-backed steps, these direct `GET` requests returned +`not_found`: `/card_tables/cards//steps.json`, +`/card_tables/cards/.json`, and +`/todos//steps.json`. To inspect trashed subtasks, add +`--status trashed`; archived parents may require `--status archived`. + +When updating a todo subtask with the raw API, include the existing `title` along +with metadata changes; omitting it may reset the step title to `Untitled`. The +generic `basecamp assign --step ...` command is intended for card +steps and may fail with `Bad Request` for todo-backed steps, so prefer +`assignee_ids` on the raw step update endpoint for todo subtasks. + ### Todolists Todolists are containers for todos. Create a todolist before adding todos.