From 12e7fc3f7ec702d89a1d0270cc27a4a2c35f98c9 Mon Sep 17 00:00:00 2001 From: Brandon Joyce Date: Wed, 10 Jun 2026 10:38:50 -0400 Subject: [PATCH 1/8] Document todo subtask API usage in Basecamp skill --- skills/basecamp/SKILL.md | 46 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index aac4734f..9ce329bd 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -431,6 +431,52 @@ 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 search to discover a step ID, or +read it directly once you know the ID. + +```bash +# Create a subtask under a todo +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 + +# 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":[12345],"due_on":"2026-06-10"}' \ + --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 + +# Delete a subtask from the todo UI by trashing the step recording +basecamp recordings trash --in --json +``` + +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. + +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. From 388c13d58c0e7baa06f819f82e9e2d1980370e4d Mon Sep 17 00:00:00 2001 From: Brandon Joyce Date: Wed, 10 Jun 2026 10:53:11 -0400 Subject: [PATCH 2/8] Address Copilot review feedback --- skills/basecamp/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 9ce329bd..3dd8286b 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -450,7 +450,7 @@ basecamp api put /buckets//card_tables/steps/.json \ # 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":[12345],"due_on":"2026-06-10"}' \ + --data '{"title":"Current subtask title","assignee_ids":[12345],"due_on":""}' \ --json # Complete or reopen a subtask @@ -461,7 +461,7 @@ basecamp api put /buckets//card_tables/steps//completions.json --data '{"completion":"off"}' \ --json -# Delete a subtask from the todo UI by trashing the step recording +# Delete a subtask from the todo UI by trashing the step record (Kanban::Step) basecamp recordings trash --in --json ``` From 29305eb0a1984d3835f90290a39470ee19552905 Mon Sep 17 00:00:00 2001 From: Brandon Joyce Date: Wed, 10 Jun 2026 12:56:00 -0400 Subject: [PATCH 3/8] Document todo subtask discovery --- skills/basecamp/SKILL.md | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 3dd8286b..24916ace 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -433,8 +433,8 @@ basecamp todos sweep --overdue --complete --comment "Done" --in **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 search to discover a step ID, or -read it directly once you know the ID. +`todos show` response may not include them; browse `Kanban::Step` recordings +and filter by `parent.id` to list/check subtasks for a todo. ```bash # Create a subtask under a todo @@ -448,9 +448,13 @@ basecamp api put /buckets//card_tables/steps/.json \ --data '{"title":"Updated subtask title"}' \ --json +# List active subtasks for a todo +basecamp recordings list --in --type Kanban::Step --all --json \ + --jq '.data[] | select(.parent.id==) | {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":[12345],"due_on":""}' \ + --data '{"title":"Current subtask title","assignee_ids":[],"due_on":""}' \ --json # Complete or reopen a subtask @@ -465,12 +469,22 @@ basecamp api put /buckets//card_tables/steps//completions.json basecamp recordings trash --in --json ``` +Replace numeric placeholders such as `` and `` before +running the JSON or `--jq` examples. + 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. +Use `basecamp recordings list --type Kanban::Step` with a `parent.id` filter to +check for subtasks under a todo. Direct `GET` requests to +`/card_tables/cards//steps.json`, `/card_tables/cards/.json`, +and `/todos//steps.json` may return `not_found` for todo-backed steps. +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 From 6e7726d8bb0cd17da7a35cad2c742bd8338b2655 Mon Sep 17 00:00:00 2001 From: Brandon Joyce Date: Wed, 10 Jun 2026 13:00:30 -0400 Subject: [PATCH 4/8] Clarify todo subtask creation path --- skills/basecamp/SKILL.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 24916ace..1ae47c60 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -437,7 +437,7 @@ basecamp todos sweep --overdue --complete --comment "Done" --in and filter by `parent.id` to list/check subtasks for a todo. ```bash -# Create a subtask under a todo +# 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 @@ -470,7 +470,9 @@ basecamp recordings trash --in --json ``` Replace numeric placeholders such as `` and `` before -running the JSON or `--jq` examples. +running the JSON or `--jq` examples. For creating todo subtasks, Basecamp +accepts the parent todo ID in the `/card_tables/cards//steps.json` +path. Completed subtasks have `completed: true` and a `completion` object with `created_at` and `creator`. Open subtasks have `completed: false` and no @@ -479,11 +481,12 @@ Completed subtasks have `completed: true` and a `completion` object with the todo UI. Use `basecamp recordings list --type Kanban::Step` with a `parent.id` filter to -check for subtasks under a todo. Direct `GET` requests to -`/card_tables/cards//steps.json`, `/card_tables/cards/.json`, -and `/todos//steps.json` may return `not_found` for todo-backed steps. -To inspect trashed subtasks, add `--status trashed`; archived parents may -require `--status archived`. +check for subtasks under a todo. The `/card_tables/cards//steps.json` +endpoint works for `POST` creation, but verified `GET` index requests to that +same path may return `not_found` for todo-backed steps; direct `GET` requests to +`/card_tables/cards/.json` and `/todos//steps.json` may also +return `not_found`. 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 From b81a19586465bee9f33f253d2fcdadbefc87281e Mon Sep 17 00:00:00 2001 From: Brandon Joyce Date: Wed, 10 Jun 2026 13:02:31 -0400 Subject: [PATCH 5/8] Clarify parent todo placeholder --- skills/basecamp/SKILL.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 1ae47c60..4c26a6b3 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -438,7 +438,7 @@ 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 \ +basecamp api post /buckets//card_tables/cards//steps.json \ --data '{"title":"Subtask title"}' \ --json @@ -450,7 +450,7 @@ basecamp api put /buckets//card_tables/steps/.json \ # List active subtasks for a todo basecamp recordings list --in --type Kanban::Step --all --json \ - --jq '.data[] | select(.parent.id==) | {id,title,status,parent:.parent.id,url}' + --jq '.data[] | select(.parent.id==) | {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 \ @@ -469,10 +469,10 @@ basecamp api put /buckets//card_tables/steps//completions.json basecamp recordings trash --in --json ``` -Replace numeric placeholders such as `` and `` before +Replace numeric placeholders such as `` and `` before running the JSON or `--jq` examples. For creating todo subtasks, Basecamp -accepts the parent todo ID in the `/card_tables/cards//steps.json` -path. +accepts the parent todo ID in the +`/card_tables/cards//steps.json` path. Completed subtasks have `completed: true` and a `completion` object with `created_at` and `creator`. Open subtasks have `completed: false` and no @@ -481,12 +481,14 @@ Completed subtasks have `completed: true` and a `completion` object with the todo UI. Use `basecamp recordings list --type Kanban::Step` with a `parent.id` filter to -check for subtasks under a todo. The `/card_tables/cards//steps.json` -endpoint works for `POST` creation, but verified `GET` index requests to that -same path may return `not_found` for todo-backed steps; direct `GET` requests to -`/card_tables/cards/.json` and `/todos//steps.json` may also -return `not_found`. To inspect trashed subtasks, add `--status trashed`; -archived parents may require `--status archived`. +check for subtasks under a todo. The +`/card_tables/cards//steps.json` endpoint works for `POST` +creation, but verified `GET` index requests to that same path may return +`not_found` for todo-backed steps; direct `GET` requests to +`/card_tables/cards/.json` and +`/todos//steps.json` may also return `not_found`. 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 From 94c4c56c492021019f8d1008103717da8e533617 Mon Sep 17 00:00:00 2001 From: Brandon Joyce Date: Wed, 10 Jun 2026 13:06:08 -0400 Subject: [PATCH 6/8] Refine todo subtask listing docs --- skills/basecamp/SKILL.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 4c26a6b3..03efb613 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -448,9 +448,10 @@ basecamp api put /buckets//card_tables/steps/.json \ --data '{"title":"Updated subtask title"}' \ --json -# List active subtasks for a todo +# List subtasks for a todo +PARENT_TODO_ID= \ basecamp recordings list --in --type Kanban::Step --all --json \ - --jq '.data[] | select(.parent.id==) | {id,title,status,parent:.parent.id,url}' + --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 \ @@ -470,9 +471,8 @@ basecamp recordings trash --in --json ``` Replace numeric placeholders such as `` and `` before -running the JSON or `--jq` examples. For creating todo subtasks, Basecamp -accepts the parent todo ID in the -`/card_tables/cards//steps.json` path. +running the examples. For creating todo subtasks, Basecamp accepts the parent +todo ID in the `/card_tables/cards//steps.json` path. Completed subtasks have `completed: true` and a `completion` object with `created_at` and `creator`. Open subtasks have `completed: false` and no @@ -483,10 +483,10 @@ the todo UI. Use `basecamp recordings list --type Kanban::Step` with a `parent.id` filter to check for subtasks under a todo. The `/card_tables/cards//steps.json` endpoint works for `POST` -creation, but verified `GET` index requests to that same path may return +creation, but in testing `GET` index requests to that same path returned `not_found` for todo-backed steps; direct `GET` requests to `/card_tables/cards/.json` and -`/todos//steps.json` may also return `not_found`. To inspect +`/todos//steps.json` also returned `not_found`. To inspect trashed subtasks, add `--status trashed`; archived parents may require `--status archived`. From b3bc186057606e75c7d76e9b288838dcb205af0a Mon Sep 17 00:00:00 2001 From: Brandon Joyce Date: Wed, 10 Jun 2026 13:07:22 -0400 Subject: [PATCH 7/8] Clarify tested GET behavior --- skills/basecamp/SKILL.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 03efb613..135d27e1 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -483,12 +483,11 @@ the todo UI. Use `basecamp recordings list --type Kanban::Step` with a `parent.id` filter to check for subtasks under a todo. The `/card_tables/cards//steps.json` endpoint works for `POST` -creation, but in testing `GET` index requests to that same path returned -`not_found` for todo-backed steps; direct `GET` requests to -`/card_tables/cards/.json` and -`/todos//steps.json` also returned `not_found`. To inspect -trashed subtasks, add `--status trashed`; archived parents may require -`--status archived`. +creation. 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 From 463a36833935890a5f2996d00bbad5bddd93b23d Mon Sep 17 00:00:00 2001 From: Brandon Joyce Date: Wed, 10 Jun 2026 13:39:12 -0400 Subject: [PATCH 8/8] Consolidate todo subtask guidance --- skills/basecamp/SKILL.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 135d27e1..44dc1831 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -433,8 +433,9 @@ basecamp todos sweep --overdue --complete --comment "Done" --in **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; browse `Kanban::Step` recordings -and filter by `parent.id` to list/check subtasks for a todo. +`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. @@ -466,13 +467,16 @@ basecamp api put /buckets//card_tables/steps//completions.json --data '{"completion":"off"}' \ --json -# Delete a subtask from the todo UI by trashing the step record (Kanban::Step) +# Trash a subtask from the todo UI by trashing the step record (Kanban::Step) basecamp recordings trash --in --json ``` -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. +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 @@ -480,11 +484,8 @@ Completed subtasks have `completed: true` and a `completion` object with `status: "trashed"` and `inherits_status: false`, but they no longer appear in the todo UI. -Use `basecamp recordings list --type Kanban::Step` with a `parent.id` filter to -check for subtasks under a todo. The -`/card_tables/cards//steps.json` endpoint works for `POST` -creation. In testing with todo-backed steps, these direct `GET` requests -returned `not_found`: `/card_tables/cards//steps.json`, +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`.