{"id":"81fab936-0a36-4905-b9ea-7accb70777c2","shortId":"EdcjXH","kind":"skill","title":"Basecamp","tagline":"Skills skill by Basecamp","description":"# /basecamp - Basecamp Workflow Command\n\nFull CLI coverage: 155 endpoints across todos, cards, messages, files, schedule, check-ins, timeline, recordings, templates, webhooks, subscriptions, lineup, chat, gauges, assignments, notifications, and accounts.\n\n## Agent Invariants\n\n**MUST follow these rules:**\n\n1. **Choose the right output mode** — `--jq` when you need to filter/extract data; `--json` for full JSON; `--md` when presenting results to a human (see Output Modes below). **Never pipe to external `jq` — use `--jq` instead.**\n2. **Parse URLs first** with `basecamp url parse \"<url>\"` to extract IDs\n3. **Comments are flat** - reply to parent recording, not to comments\n4. **Check context** via `.basecamp/config.json` before assuming project\n5. **Content fields accept Markdown and @mentions** — message body and comment content accept Markdown syntax; the CLI converts to HTML automatically. Use Markdown formatting (lists, bold, links, code blocks) for rich content. Four mention syntaxes are available (prefer deterministic for agents):\n   - **`[@Name](mention:SGID)`** — zero API calls, embeds SGID directly (preferred for agents)\n   - **`[@Name](person:ID)`** — one API call, resolves person ID to SGID via pingable set\n   - **`@sgid:VALUE`** — inline SGID embed for pipeline composability\n   - **`@Name` / `@First.Last`** — fuzzy name resolution (may be ambiguous)\n   For todos, documents, and cards, content is sent as-is — use plain text or HTML directly.\n6. **Project scope is mandatory for most commands** — via `--in <project>` or `.basecamp/config.json`. Cross-project exceptions: `basecamp reports assigned` for assigned work, `basecamp assignments` for structured assignment views, `basecamp reports overdue` for overdue todos, `basecamp reports schedule` for upcoming schedule across all projects, `basecamp recordings <type>` for browsing by type, `basecamp notifications` for notifications, `basecamp gauges list` for account-wide gauges.\n\n### Output Modes\n\n**Choosing a mode:**\n\n| Goal | Flag | Format |\n|------|------|--------|\n| Filter/extract JSON data | `--jq '<expr>'` | Built-in jq filter (no external jq needed). Implies `--json`; filter runs on the envelope. |\n| Filter in agent mode | `--agent --jq '<expr>'` | Filter runs on data-only payload (no envelope), matching `--agent` contract. |\n| Full JSON output | `--json` | JSON envelope: `{ok, data, summary, breadcrumbs, meta}` |\n| Show results to a user | `--md` / `-m` | GFM tables, task lists, structured Markdown |\n| Automation / scripting | `--agent` | Success: raw JSON data (no envelope); errors: `{ok:false,...}` object; no interactive prompts |\n\nAlways pass `--json` or `--md` explicitly — auto-detection depends on config and may not produce the format you expect. Use `--md` when composing reports, summarizing data, or displaying results inline. `--agent` is for headless integration scripts.\n\n**Other modes:** `--quiet` (success: raw JSON, no envelope; errors: `{ok:false,...}`), `--ids-only`, `--count`, `--stats` (session statistics), `--styled` (force ANSI), `-v` / `-vv` (verbose/trace), `--jq '<expr>'` (built-in jq filter — see below).\n\n### CLI Introspection\n\nNavigate unfamiliar commands with `--agent --help` — returns structured JSON describing any command:\n\n```bash\nbasecamp todos --agent --help\n```\n\n```json\n{\"command\":\"todos\",\"path\":\"basecamp todos\",\"short\":\"...\",\"long\":\"...\",\"usage\":\"...\",\"notes\":[\"...\"],\n \"subcommands\":[{\"name\":\"sweep\",\"short\":\"...\",\"path\":\"basecamp todos sweep\"}],\n \"flags\":[{\"name\":\"assignee\",\"type\":\"string\",\"default\":\"\",\"usage\":\"...\"}],\n \"inherited_flags\":[{\"name\":\"json\",\"shorthand\":\"j\",\"type\":\"bool\",\"default\":\"false\",\"usage\":\"...\"}]}\n```\n\nWalk the tree: start at `basecamp --agent --help` for top-level commands, then drill into any subcommand. Commands include `notes` with domain-specific agent hints (e.g., \"Cards do NOT support --assignee filtering\").\n\n### Pagination\n\n```bash\nbasecamp <cmd> --limit 50   # Cap results (default varies by resource)\nbasecamp <cmd> --all        # Fetch all (may be slow for large datasets)\nbasecamp <cmd> --page 1     # First page only, no auto-pagination\n```\n\n`--all` and `--limit` are mutually exclusive. `--page` cannot combine with either.\n\n### Smart Defaults\n\n- `--assignee me` resolves to current user\n- `--due tomorrow` / `--due +3` / `--due \"next week\"` - natural date parsing\n- Project from `.basecamp/config.json` if `--in` not specified\n\n## Quick Reference\n\n> **Note:** Most queries require project scope (via `--in <project>` or `.basecamp/config.json`). Cross-project exceptions: `basecamp reports assigned`, `basecamp assignments`, `basecamp reports overdue`, `basecamp reports schedule`, `basecamp recordings <type>`, `basecamp notifications`, `basecamp gauges list`.\n\n| Task | Command |\n|------|---------|\n| List projects | `basecamp projects list --json` |\n| My todos (in project) | `basecamp todos list --assignee me --in <project> --json` |\n| My todos (cross-project) | `basecamp reports assigned --json` (defaults to \"me\") |\n| My schedule (cross-project) | `basecamp reports schedule --json` (upcoming events across all projects) |\n| All todos (cross-project) | `basecamp recordings todos --json` (no assignee data — cannot filter by person) |\n| Overdue todos (in project) | `basecamp todos list --overdue --in <project> --json` |\n| Overdue todos (cross-project) | `basecamp reports overdue --json` |\n| Assign todo | `basecamp assign <id> [id...] --to <person> --in <project> --json` |\n| Assign card | `basecamp assign <id> [id...] --card --to <person> --in <project> --json` |\n| Assign card step | `basecamp assign <id> [id...] --step --to <person> --in <project> --json` |\n| Create todo | `basecamp todo \"Task\" --in <project> --list <list> --json` |\n| Create todolist | `basecamp todolists create \"Name\" --in <project> --json` |\n| Complete todo | `basecamp done <id> --json` |\n| List cards | `basecamp cards list --in <project> --json` |\n| Create card | `basecamp card \"Title\" --in <project> --json` |\n| Move card | `basecamp cards move <id> --to <column> [--position N] --in <project> --json` |\n| Move card to on-hold | `basecamp cards move <id> --on-hold --in <project> --json` |\n| Post message | `basecamp message \"Title\" \"Body\" --in <project> --json` |\n| Post with @mention | `basecamp message \"Title\" \"Hey @First.Last, ...\" --in <project> --json` |\n| Post silently | `basecamp message \"Title\" \"Body\" --no-subscribe --in <project> --json` |\n| Post to chat | `basecamp chat post \"Message\" --in <project> --json` |\n| Add comment | `basecamp comment <recording_id> \"Text\" --in <project> --json` |\n| List attachments | `basecamp attachments list <id\\|url> --json` |\n| Download attachments | `basecamp attachments download <id> --out /tmp/` |\n| Show + download | `basecamp todos show <id> --download-attachments --json` |\n| Stream attachment to stdout | `basecamp attachments download <id> --file <name> --out -` |\n| Search | `basecamp search \"query\" --json` |\n| Parse URL | `basecamp url parse \"<url>\" --json` |\n| Upload file | `basecamp files uploads create <file> [--vault <folder_id>] --in <project> --json` |\n| Download file | `basecamp files download <id> --in <project>` |\n| Stream file to stdout | `basecamp files download <id> --out - --in <project>` |\n| Download storage URL | `basecamp files download \"https://storage.3.basecamp.com/.../download/report.pdf\"` |\n| My assignments | `basecamp assignments --json` (priorities + non-priorities) |\n| Overdue assignments | `basecamp assignments due overdue --json` |\n| Completed assignments | `basecamp assignments completed --json` |\n| Notifications | `basecamp notifications --json` |\n| Mark notification read | `basecamp notifications read <id> --json` |\n| Gauges (account-wide) | `basecamp gauges list --json` |\n| Gauge needles | `basecamp gauges needles --in <project> --json` |\n| Create needle | `basecamp gauges create --position 75 --color green --in <project> --json` |\n| Account details | `basecamp accounts show --json` |\n| Watch timeline | `basecamp timeline --watch` |\n\n## URL Parsing\n\n**Always parse URLs before acting on them:**\n\n```bash\nbasecamp url parse \"https://3.basecamp.com/2914079/buckets/41746046/messages/9478142982#__recording_9488783598\" --json\n```\n\nReturns: `account_id`, `project_id`, `type`, `recording_id`, `comment_id` (from fragment).\n\n**URL patterns:**\n- `/buckets/27/messages/123` - Message 123 in project 27\n- `/buckets/27/messages/123#__recording_456` - Comment 456 on message 123\n- `/buckets/27/card_tables/cards/789` - Card 789\n- `/buckets/27/card_tables/columns/456` - Column 456 (for creating cards)\n- `/buckets/27/todos/101` - Todo 101\n- `/buckets/27/uploads/202` - Upload/file 202\n- `/buckets/27/documents/303` - Document 303\n- `/buckets/27/schedule_entries/404` - Schedule entry 404\n\n**Replying to comments:**\n```bash\n# Comments are flat - reply to the parent recording_id, not the comment_id\nbasecamp url parse \"https://...messages/123#__recording_456\" --json\n# Returns recording_id: 123 (parent), comment_id: 456 (fragment) - comment on 123, not 456\nbasecamp comment 123 \"Reply\" --in <project>\n```\n\n## Decision Trees\n\n### Finding Content\n\n```\nNeed to find something?\n├── Know the type + project? → basecamp <type> list --in <project> --json\n│   (some groups have default list behavior; use --agent --help if unsure)\n├── My assigned work? → basecamp assignments --json (priorities + non-priorities)\n│   Or: basecamp reports assigned --json (traditional view, defaults to \"me\")\n├── My overdue assignments? → basecamp assignments due overdue --json\n├── My notifications? → basecamp notifications --json\n├── Upcoming schedule? → basecamp reports schedule --json (cross-project)\n├── Overdue across projects? → basecamp reports overdue --json\n├── Browse by type cross-project? → basecamp recordings <type> --json\n│   (types: todos, messages, documents, comments, cards, uploads)\n│   Note: Defaults to active status; use --status archived for archived items\n│   ⚠ No assignee data — cannot filter by person; use reports assigned instead\n├── Full-text search? → basecamp search \"query\" --json\n└── Have a URL? → basecamp url parse \"<url>\" --json\n```\n\n### Modifying Content\n\n```\nWant to change something?\n├── Have URL? → basecamp url parse \"<url>\" → use extracted IDs\n├── Have ID? → basecamp <resource> update <id> --field value\n├── Change status? → basecamp recordings trash|archive|restore <id>\n└── Complete todo? → basecamp done <id>\n```\n\n## Common Workflows\n\n### Link Code to Basecamp Todo\n\n```bash\n# Get commit info and comment on todo (use printf %q for safe quoting)\nCOMMIT=$(git rev-parse --short HEAD)\nMSG=$(git log -1 --format=%s)\nbasecamp comment <todo_id> \"Commit $COMMIT: $(printf '%s' \"$MSG\")\" --in <project>\n\n# Complete when done\nbasecamp done <todo_id>\n```\n\n### Track PR in Basecamp\n\n```bash\n# Create todo for PR work\nbasecamp todo \"Review PR #42\" --in <project> --assignee me --due tomorrow\n\n# When merged\nbasecamp done <todo_id>\nbasecamp chat post \"Merged PR #42\" --in <project>\n```\n\n### Bulk Process Overdue Todos\n\n```bash\n# Preview overdue todos\nbasecamp todos sweep --overdue --dry-run --in <project>\n\n# Complete all with comment\nbasecamp todos sweep --overdue --complete --comment \"Cleaning up\" --in <project>\n```\n\n### Mentioning people (preferred — deterministic)\n\n```bash\n# 1. Look up the person\nbasecamp people pingable --jq '.data[] | select(.name == \"Jane Smith\")'\n# => {\"id\": 42000, \"attachable_sgid\": \"BAh7CEkiCG...\", \"name\": \"Jane Smith\"}\n\n# 2. Use SGID in Markdown mention syntax (zero API calls during post)\nbasecamp comment 123 \"Hey [@Jane Smith](mention:BAh7CEkiCG...), check this\" --in <project>\n\n# Or use person ID (one lookup during post)\nbasecamp comment 123 \"Hey [@Jane Smith](person:42000), check this\" --in <project>\n```\n\n### Mentioning people (interactive — may be ambiguous)\n\n```bash\n# Fuzzy matching: use @First.Last to reduce ambiguity\nbasecamp comment <id> \"@Jane.Smith, please review this\" --in <project>\nbasecamp message \"Update\" \"cc @Jane, @Alex\" --in <project>\nbasecamp chat post \"@Jane, done!\" --in <project>\n\n# Ambiguous names return an error with suggestions\n# Use @First.Last for disambiguation\n```\n\n### Move Card Through Workflow\n\n```bash\n# List columns to get IDs\nbasecamp cards columns --in <project> --json\n\n# Move card to column\nbasecamp cards move <card_id> --to <column_id> --in <project>\n\n# Move card to specific position in column (1-indexed)\nbasecamp cards move <card_id> --to <column_id> --position 1 --in <project>\n\n# Move card to on-hold section of its current column\nbasecamp cards move <card_id> --on-hold --in <project>\n\n# Move card to on-hold section of a specific column (numeric ID)\nbasecamp cards move <card_id> --to <column_id> --on-hold --in <project>\n\n# Move card to on-hold section of a named column (requires --card-table)\nbasecamp cards move <card_id> --to \"Column Name\" --on-hold --card-table <table_id> --in <project>\n```\n\n### Download File from Basecamp\n\n```bash\nbasecamp files download <upload_id> --in <project> --out ./downloads\n\n# Download attachment from a storage URL (no --in needed)\nbasecamp files download \"https://storage.3.basecamp.com/123/blobs/abc/download/report.pdf\"\n\n# Stream to stdout (for piping)\nbasecamp files download <upload_id> --out - --in <project>\n```\n\n### Working with Attachments (Multimodal Agent Workflow)\n\nMessages, todos, cards, and documents may contain images and file attachments\n(mockups, screenshots, annotated designs). Show commands surface these as\nfield-scoped collections — `content_attachments` and/or `description_attachments`\n— keyed by which rich-text attribute contained them. The notice field hints at\nthe download command.\n\n**Step 1: Fetch the recording and check for attachments**\n```bash\nbasecamp todos show <id> --json\n# Response includes description_attachments when attachments are present\n# Messages/documents use content_attachments; cards may have both\n# The notice field hints: \"3 attachment(s) — download: basecamp attachments download <id>\"\n```\n\n**Step 2 (one-shot): Download attachments with the show command**\n```bash\n# --download-attachments fetches + downloads in one shot\nbasecamp todos show <id> --download-attachments --json\n# content_attachments/description_attachments entries now include \"path\" pointing to local files\n# Downloads to OS temp dir by default, or specify: --download-attachments /tmp/att\n```\n\n**Step 2 (two-step alternative): Download separately**\n```bash\n# Download all at once (shows progress on stderr)\nbasecamp attachments download <id> --out /tmp/attachments\n```\n\n**Step 3: View images with your native file-read tool**\nFor multimodal LLMs (Claude, Gemini), use your file-read tool on the `path`\nfrom the response to view downloaded images directly — no browser needed.\nThis surfaces visual context (mockups, screenshots, annotated designs) that\nis often the most important part of a Basecamp todo or message.\n\n```bash\n# Stream a single image to stdout for piping\nbasecamp attachments download <id> --file mockup.png --out -\n\n# Select by index when names collide\nbasecamp attachments download <id> --index 2 --out -\n```\n\n**Key pattern:** When a show command response contains `content_attachments`\nor `description_attachments`, always download and view them — visual context is\noften more important than the text content. Use `--download-attachments` for\none-shot fetch+download, or follow the breadcrumb hint for two-step control.\n\n## Resource Reference\n\n### Projects\n\n```bash\nbasecamp projects list --json               # List all\nbasecamp projects show <id> --json          # Show details\nbasecamp projects create \"Name\" --json      # Create\nbasecamp projects update <id> --name \"New\"  # Update\n```\n\n### Todos\n\n```bash\nbasecamp todos list --in <project> --json               # List in project\nbasecamp todos list --assignee me --in <project>        # My todos\nbasecamp todos list --overdue --in <project>            # Overdue only\nbasecamp todos list --status completed --in <project>   # Completed\nbasecamp todos list --list <todolist_id> --in <project> # In specific list\nbasecamp todo \"Task\" --in <project> --list <list> --assignee me --due tomorrow\nbasecamp done <id> [id...]                              # Complete (multiple OK)\nbasecamp reopen <id>                                    # Uncomplete\nbasecamp assign <id> [id...] --to <person> --in <project>       # Assign to-do (multiple OK)\nbasecamp unassign <id> [id...] --from <person> --in <project>   # Remove to-do assignee (multiple OK)\nbasecamp assign <id> [id...] --card --to <person> --in <project>   # Assign card\nbasecamp unassign <id> [id...] --card --from <person> --in <project> # Remove card assignee\nbasecamp assign <id> [id...] --step --to <person> --in <project>   # Assign card step\nbasecamp unassign <id> [id...] --step --from <person> --in <project> # Remove step assignee\nbasecamp todos position <id> --to 1                     # Move to top\nbasecamp todos position <id> --to 1 --list <id|name|url> # Move to different list\nbasecamp todos sweep --overdue --complete --comment \"Done\" --in <project>\n```\n\n**Flags:** `--assignee` (todos only - not available on cards/messages), `--status` (completed/incomplete), `--overdue`, `--list`, `--due`, `--limit`, `--all`\n\n### Todolists\n\nTodolists are containers for todos. Create a todolist before adding todos.\n\n```bash\nbasecamp todolists list --in <project> --json              # List todolists\nbasecamp todolists show <id> --in <project>                # Show details\nbasecamp todolists create \"Name\" --in <project> --json     # Create\nbasecamp todolists create \"Name\" --description \"Desc\" --in <project>\nbasecamp todolists update <id> --name \"New\" --in <project> # Update\n```\n\n### Cards (Kanban)\n\n**Note:** Cards do NOT support `--assignee` filtering like todos. Fetch all cards and filter client-side if needed. If a project has multiple card tables, you must specify `--card-table <id>`. When you get an \"Ambiguous card table\" error, the hint shows available table IDs and names.\n\n```bash\nbasecamp cards list --in <project> --json             # All cards\nbasecamp cards list --card-table <id> --in <project>  # Specific table (required if multiple)\nbasecamp cards list --column <id> --in <project>      # Cards in column\nbasecamp cards columns --in <project> --json          # List columns (needs --card-table if multiple)\nbasecamp cards show <id> --in <project>               # Card details\nbasecamp card \"Title\" \"<p>Body</p>\" --in <project> --column <id>\nbasecamp cards update <id> --title \"New\" --due tomorrow --assignee me\nbasecamp cards move <id> --to <column_id>             # Move to column (numeric ID)\nbasecamp cards move <id> --to \"Done\" --card-table <table_id>  # Move by name (needs table)\nbasecamp cards move <id> --to \"Done\" --position 1 --card-table <table_id>  # Move to position\nbasecamp cards move <id> --on-hold                    # Move to on-hold of current column\nbasecamp cards move <id> --to <column_id> --on-hold   # Move to on-hold of target column\n```\n\n**Archived/trashed cards:** `cards list` only returns active cards. For archived or trashed cards, use `basecamp recordings cards --status archived --in <project>` or `--status trashed`.\n\n**Identifying completed cards:** Cards in Done columns have `parent.type: \"Kanban::DoneColumn\"` and `completed: true`. Use this to identify completed cards that haven't been archived.\n\n**Limitation:** Basecamp does not track when cards are moved between columns. The `updated_at` field updates on any modification and cannot reliably indicate when a card was completed.\n\n**Card Steps (checklists):**\n```bash\nbasecamp cards steps <card_id> --in <project>     # List steps\nbasecamp cards step create \"Step\" --card <id> --in <project>\nbasecamp cards step complete <step_id> --in <project>\nbasecamp cards step uncomplete <step_id>\n```\n\n**Column management:**\n```bash\nbasecamp cards column show <id> --in <project>\nbasecamp cards column create \"Name\" --in <project>\nbasecamp cards column update <id> --title \"New\"\nbasecamp cards column move <id> --position 2\nbasecamp cards column color <id> --color blue\nbasecamp cards column on-hold <id>                # Enable on-hold section\nbasecamp cards column watch <id>                  # Subscribe to column\n```\n\n### Messages\n\n```bash\nbasecamp messages list --in <project> --json  # List messages\nbasecamp messages show <id> --in <project>    # Show message\nbasecamp message \"Title\" \"Body\" --in <project>\nbasecamp message \"Draft\" \"WIP\" --draft --in <project>  # Create draft\nbasecamp messages publish <id>               # Publish a draft\nbasecamp messages update <id> --title \"New\" --body \"Updated\"\nbasecamp messages pin <id> --in <project>     # Pin to top\nbasecamp messages unpin <id>                  # Unpin\n```\n\n**Archived/trashed messages:** `messages list` only returns active messages. For archived or trashed messages, use `basecamp recordings messages --status archived --in <project>` or `--status trashed`.\n\n**Flags:** `--draft` (create as draft), `--no-subscribe` (silent, no notifications), `--subscribe \"people\"` (comma-separated names, emails, IDs, or \"me\"; mutually exclusive with `--no-subscribe`), `--message-board <id>` (if multiple boards)\n\n```bash\nbasecamp message \"Bot update\" \"Done\" --no-subscribe --in <project>\nbasecamp message \"FYI\" \"Note\" --subscribe \"Alice,bob@x.com\" --in <project>\n```\n\n### Comments\n\n```bash\nbasecamp comments list <recording_id> --in <project> --json\nbasecamp comment <recording_id> \"Text\" --in <project>\nbasecamp comment <recording_id> \"@Jane.Smith, looks good!\" --in <project>  # With @mention\nbasecamp comments update <id> \"Updated\" --in <project>\n```\n\n### Files & Documents\n\n```bash\nbasecamp files list --in <project> --json               # List all (folders, files, docs)\nbasecamp files list --vault <folder_id> --in <project>  # List folder contents\nbasecamp files show <id> --in <project>                 # Show item (auto-detects type)\nbasecamp files download <id> --in <project>             # Download file\nbasecamp files download <id> --out ./dir                # Download to specific dir\nbasecamp files download \"https://storage.../download/f\" # Download from storage URL\nbasecamp files uploads create <file> --in <project>      # Upload file to root\nbasecamp files uploads create <file> --vault <folder_id> --in <project>  # Upload to folder\nbasecamp files folder create \"Folder\" --in <project>\nbasecamp files doc create \"Doc\" \"Body\" --in <project>\nbasecamp files doc create \"Draft\" --draft --in <project>\nbasecamp files doc create \"Notes\" \"...\" --no-subscribe --in <project>\nbasecamp files update <id> --title \"New\" --content \"Updated\"\n```\n\n**Subcommands:** `folders`, `uploads`, `documents` (each with pagination flags)\n\n### Schedule\n\nFor upcoming events across all projects, use `basecamp reports schedule --json`.\n\n```bash\nbasecamp schedule info --in <project> --json       # Schedule info\nbasecamp schedule entries --in <project> --json   # List entries\nbasecamp schedule show <id> --in <project>        # Entry details\nbasecamp schedule show <id> --date 20240315       # Specific occurrence (recurring)\nbasecamp schedule create \"Event\" --starts-at \"2024-03-15T09:00:00Z\" --ends-at \"2024-03-15T10:00:00Z\" --in <project>\nbasecamp schedule create \"Meeting\" --all-day --notify --participants 1,2,3 --in <project>\nbasecamp schedule create \"Sync\" --starts-at \"...\" --ends-at \"...\" --no-subscribe --in <project>\nbasecamp schedule update <id> --summary \"New title\" --starts-at \"...\"\nbasecamp schedule settings --include-due --in <project>  # Include todos/cards due dates\n```\n\n**Flags:** `--all-day`, `--notify`, `--participants <ids>`, `--no-subscribe`, `--subscribe \"people\"` (mutually exclusive), `--status` (active/archived/trashed)\n\n### Check-ins\n\n```bash\nbasecamp checkins --in <project> --json           # Questionnaire info\nbasecamp checkins questions --in <project>        # List questions\nbasecamp checkins question <id> --in <project>    # Question details\nbasecamp checkins answers <question_id> --in <project>  # List answers\nbasecamp checkins answer <id> --in <project>      # Answer details\nbasecamp checkins question create \"What did you work on?\" --in <project>\nbasecamp checkins question update <id> \"New question\" --frequency every_week\nbasecamp checkins answer create <question-id> \"My answer\" --in <project>  # Defaults to today\nbasecamp checkins answer update <id> \"Updated\" --in <project>\n```\n\n**Schedule options:** `--frequency` (every_day, every_week, every_other_week, every_month, on_certain_days), `--days 1,2,3,4,5` (0=Sun), `--time \"5:00pm\"`\n\n### Timeline\n\n```bash\nbasecamp timeline --json                          # Account-wide activity\nbasecamp timeline --in <project> --json           # Project activity\nbasecamp timeline me --json                       # Your activity\nbasecamp timeline --person <id> --json            # Person's activity\nbasecamp timeline --watch                         # Live monitoring (TUI)\nbasecamp timeline --watch --interval 60           # Poll every 60 seconds\n```\n\nUse `--limit N` to cap results or `--all` to fetch everything (default: 100 events). `--all` and `--page` cannot be combined with `--watch`.\n\n### Recordings (Cross-project)\n\nUse `basecamp recordings <type>` for cross-project type browsing. **For assigned todos, prefer `basecamp reports assigned`** — recordings do not include assignee data and cannot be filtered by person.\n\n```bash\nbasecamp recordings todos --json                  # All todos across projects\nbasecamp recordings todos --all --json            # All todos (paginate through all)\nbasecamp recordings messages --in <project>       # Messages in project\nbasecamp recordings documents --status archived   # Archived docs\nbasecamp recordings cards --sort created_at --direction asc\nbasecamp recordings cards --status archived --all --json  # Include archived cards\n```\n\n**Types:** `todos`, `messages`, `documents`, `comments`, `cards`, `uploads`\n\n**Status filtering:** By default, only `active` recordings are returned. Use `--status archived` or `--status trashed` to query other statuses. You may need separate queries to get complete data (e.g., active + archived).\n\n**Status management:**\n```bash\nbasecamp recordings trash <id> --in <project>     # Move to trash\nbasecamp recordings archive <id> --in <project>   # Archive\nbasecamp recordings restore <id> --in <project>   # Restore to active\nbasecamp recordings visibility <id> --visible --in <project>  # Show to clients\nbasecamp recordings visibility <id> --hidden      # Hide from clients\n```\n\n### Templates\n\n```bash\nbasecamp templates --json                         # List templates\nbasecamp templates show <id> --json               # Template details\nbasecamp templates create \"Template Name\"         # Create empty template\nbasecamp templates update <id> --name \"New Name\"\nbasecamp templates delete <id>                    # Trash template\nbasecamp templates construct <id> --name \"New Project\"  # Create project (async)\nbasecamp templates construction <template_id> <construction_id>  # Check status\n```\n\n**Construct returns construction_id - poll until status=\"completed\" to get project.**\n\n### Webhooks\n\n```bash\nbasecamp webhooks list --in <project> --json  # List webhooks\nbasecamp webhooks show <id> --in <project>    # Webhook details\nbasecamp webhooks create \"https://...\" --in <project>\nbasecamp webhooks create \"https://...\" --types \"Todo,Comment\" --in <project>\nbasecamp webhooks update <id> --active --in <project>\nbasecamp webhooks update <id> --inactive      # Disable\nbasecamp webhooks delete <id> --in <project>\n```\n\n**Event types:** Todo, Todolist, Message, Comment, Document, Upload, Vault, Schedule::Entry, Kanban::Card, Question, Question::Answer\n\n### Subscriptions\n\n```bash\nbasecamp subscriptions <recording_id>              # Who's subscribed\nbasecamp subscriptions subscribe <id>              # Subscribe yourself\nbasecamp subscriptions unsubscribe <id>            # Unsubscribe\nbasecamp subscriptions add <id> --people 1,2,3     # Add people\nbasecamp subscriptions remove <id> --people 1,2,3  # Remove people\n```\n\n### Lineup (Account-wide Markers)\n\n```bash\nbasecamp lineup list                              # List all markers\nbasecamp lineup create \"Milestone\" \"2024-03-15\"   # Create marker\nbasecamp lineup create \"Launch\" tomorrow          # Natural date parsing\nbasecamp lineup update <id> \"New Name\" \"+7\"\nbasecamp lineup delete <id>\n```\n\n**Note:** Lineup markers are account-wide, not project-scoped.\n\n### Gauges\n\nGauges track project progress with colored needles on a 0-100 scale.\n\n```bash\nbasecamp gauges list --json                           # All gauges (account-wide)\nbasecamp gauges needles --in <project> --json         # Needles for a project\nbasecamp gauges needle <id> --json                    # Needle details\nbasecamp gauges create --position 75 --color green --in <project>\nbasecamp gauges create --position 50 --color yellow --description \"Halfway\" --in <project>\nbasecamp gauges create --position 25 --notify custom --subscriptions 1,2 --in <project>\nbasecamp gauges update <id> --description \"Updated\"\nbasecamp gauges delete <id>\nbasecamp gauges enable --in <project>                 # Enable gauge on project\nbasecamp gauges disable --in <project>                # Disable gauge\n```\n\n**Colors:** green, yellow, red. **Notify:** everyone, working_on, custom (with `--subscriptions`).\n\n### Assignments\n\nView your assignments across all projects. Separate from `reports assigned` — provides structured priority grouping and due-date scoping.\n\n```bash\nbasecamp assignments --json                           # All (priorities + non-priorities)\nbasecamp assignments list --json                      # Same as bare\nbasecamp assignments completed --json                 # Completed assignments\nbasecamp assignments due overdue --json               # Overdue\nbasecamp assignments due due_today --json             # Due today\nbasecamp assignments due due_tomorrow --json          # Due tomorrow\nbasecamp assignments due due_later_this_week --json   # Due later this week\n```\n\n**Scopes:** overdue, due_today, due_tomorrow, due_later_this_week, due_next_week, due_later.\n\n### Notifications\n\n```bash\nbasecamp notifications --json                         # List (page 1)\nbasecamp notifications list --page 2 --json           # Page 2\nbasecamp notifications read <id> --json               # Mark as read\nbasecamp notifications read <id> <id> --page 2 --json # Mark from page 2\n```\n\n**Note:** `read` resolves notification IDs from the specified page. Use `--page` to match the page you listed.\n\n### Accounts\n\n```bash\nbasecamp accounts list --json                         # List authorized accounts\nbasecamp accounts use <id>                            # Set default account\nbasecamp accounts show --json                         # Account details, limits, subscription\nbasecamp accounts update --name \"New Name\" --json     # Rename account\nbasecamp accounts logo upload <file> --json           # Upload logo (PNG/JPEG/GIF/WebP/AVIF/HEIC, 5MB max)\nbasecamp accounts logo remove --json                  # Remove logo\n```\n\n### Chat\n\n```bash\nbasecamp chat --in <project> --json           # List chats\nbasecamp chat messages --in <project> --json  # List messages\nbasecamp chat post \"Hello!\" --in <project>\nbasecamp chat post \"@Jane.Smith, check this\" --in <project>  # With @mention (auto text/html)\nbasecamp chat line <line_id> --in <project>   # Show line\nbasecamp chat delete <line_id> --in <project> --force # Delete line (permanent, not trashable)\n```\n\n### People\n\n```bash\nbasecamp people list --json                          # All people in account\nbasecamp people list --project <project> --json    # People on project\nbasecamp me --json                                 # Current user\nbasecamp people show <id> --json                   # Person details\nbasecamp people add <id> --project <project>       # Add to project\nbasecamp people remove <id> --project <project>    # Remove from project\n```\n\n### Search\n\n```bash\nbasecamp search \"query\" --json                    # Full-text search\nbasecamp search \"query\" --sort updated_at --limit 20\nbasecamp search metadata --json                   # Available search scopes\n```\n\n### Generic Show\n\n```bash\nbasecamp show <type> <id> --in <project> --json   # Show any recording type\n# Types: todo, todolist, message, comment, card, card-table, document (or omit <type> for generic lookup)\n```\n\n## Configuration\n\nThe CLI uses two directory namespaces: `basecamp` for your Basecamp identity and project relationships, `basecamp` for tool-specific operational data.\n\n```\n~/.config/basecamp/           # Basecamp identity (DO NOT read credentials)\n├── credentials.json          #   OAuth tokens — NEVER read or log\n├── client.json               #   DCR client registration\n└── config.json               #   Global preferences (account_id, base_url, format)\n\n~/.cache/basecamp/            # Tool cache (ephemeral, auto-managed)\n├── completion.json           #   Tab completion cache\n└── resilience/               #   Circuit breaker state\n\n.basecamp/                    # Per-repo config (committed to git)\n└── config.json               #   Project defaults (project_id, account_id, todolist_id)\n```\n\n**Per-repo config:** `.basecamp/config.json`\n```json\n{\n  \"project_id\": \"12345\",\n  \"todolist_id\": \"67890\"\n}\n```\n\n**Initialize:**\n```bash\nbasecamp config init\nbasecamp config set project_id <id>\nbasecamp config set todolist_id <id>\n```\n\n**Config Trust:**\n\nAuthority keys (`base_url`, `default_profile`, `profiles`) in local/repo configs are blocked until explicitly trusted. This prevents a cloned repo's config from redirecting OAuth tokens.\n\n```bash\nbasecamp config trust                    # Trust nearest .basecamp/config.json\nbasecamp config trust /path/to/.basecamp/config.json  # Trust specific config file\nbasecamp config trust --list             # Show all trusted configs\nbasecamp config untrust                  # Revoke trust for nearest config\nbasecamp config untrust /path/to/.basecamp/config.json  # Revoke trust for specific path\n```\n\n**Check context:**\n```bash\ncat .basecamp/config.json 2>/dev/null || echo \"No project configured\"\n```\n\n**Global config:** `~/.config/basecamp/config.json` (account_id, base_url, format preferences)\n\n## Error Handling\n\n**General diagnostics:**\n```bash\nbasecamp doctor --json                            # Check CLI health, auth, connectivity\n```\n\n**Rate limiting (429):** The CLI handles backoff automatically. If you see 429 errors, reduce request frequency.\n\n**Authentication errors:**\n```bash\nbasecamp auth status                              # Check auth\nbasecamp auth login                               # Re-authenticate\nbasecamp auth login --scope full                  # Full access (BC3 OAuth only)\nbasecamp auth login --device-code                 # Headless: display URL, paste callback\n```\n\n**Network errors / localhost URLs:**\n```bash\n# Check for dev config\ncat ~/.config/basecamp/config.json\n# Should only contain: {\"account_id\": \"<id>\"}\n# Remove base_url/api_url if pointing to localhost\n```\n\n**Not found errors:**\n```bash\nbasecamp auth status                              # Verify auth working\ncat ~/.config/basecamp/accounts.json              # Check available accounts\n```\n\n**Required arguments are positional (not flags):**\n- `basecamp todo \"Buy milk\"` (not `--content`)\n- `basecamp card \"New feature\"` (not `--title`)\n- `basecamp message \"Subject\" \"Body\"` (not `--subject`)\n- `basecamp chat post \"Hello\"` (not `--content`)\n- `basecamp comment <id> \"Text\"` (not a flag)\n- `basecamp webhooks create \"https://...\" --in <project>` (not `--url`)\n- `basecamp checkins answer create <question-id> \"content\"` (not `--question`)\n- `--date YYYY-MM-DD` is optional for `checkins answer create`; if omitted, it defaults to today\n\n**Missing argument errors (code: \"usage\"):**\nWhen a required positional argument is missing, the CLI returns a structured error naming\nthe specific argument. Use this for elicitation:\n\n```bash\n$ basecamp todo --json\n{\"ok\": false, \"error\": \"<content> required\", \"code\": \"usage\",\n \"hint\": \"Usage: basecamp todo <content>\"}\n\n$ basecamp comments create 123 --json\n{\"ok\": false, \"error\": \"<content> required\", \"code\": \"usage\", ...}\n```\n\nThe `error` field names the missing `<arg>` — use it to prompt the user for the specific value.\n\n**URL malformed (curl exit 3):** Special characters in content. Use plain text or properly escaped HTML.\n\n## Built-in jq Filtering\n\nThe CLI has a built-in `--jq` flag powered by gojq — no external `jq` binary required. **Always prefer `--jq` over piping to external `jq`.**\n\n```bash\n# Extract fields from data array\nbasecamp todos list --in <project> --jq '.data[] | select(.completed == false) | .title'\nbasecamp todos list --in <project> --jq '.data | length'\nbasecamp todos list --in <project> --jq '[.data[] | {id, title, status}]'\n\n# Access envelope metadata\nbasecamp todos list --in <project> --jq '.breadcrumbs[0].cmd'\nbasecamp todos list --in <project> --jq '.meta.stats.requests'\n\n# Filter and transform\nbasecamp cards list --in <project> --jq '[.data[] | select(.completed == true) | .title]'\nbasecamp people list --jq '[.data[] | {name: .name, email: .email_address}]'\n```\n\n`--jq` implies `--json` — no need to pass both. String results print as plain text; objects and arrays print as formatted JSON.\n\n## Exit Codes\n\n| Exit | Meaning | Fix |\n|------|---------|-----|\n| 0 | OK | — |\n| 1 | Usage error | Check `basecamp <cmd> --help` |\n| 2 | Not found | Verify ID/URL exists |\n| 3 | Auth error | `basecamp auth login` |\n| 4 | Forbidden | Check account/project permissions |\n| 5 | Rate limit | Wait and retry (resilience layer handles Retry-After automatically) |\n| 6 | Network error | Check connectivity, `basecamp doctor` |\n| 7 | API error | Retry; if persistent, check `basecamp doctor` |\n| 8 | Ambiguous | Be more specific (use ID instead of name) |\n\n## Learn More\n\n- API concepts: https://github.com/basecamp/bc3-api#key-concepts\n- CLI repo: https://github.com/basecamp/basecamp-cli\n- API coverage: See API-COVERAGE.md in the CLI repo","tags":["basecamp","skills"],"capabilities":["skill","source-basecamp","category-skills"],"categories":["skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/basecamp/skills/basecamp","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under basecamp/skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T19:40:53.107Z","embedding":null,"createdAt":"2026-04-18T20:35:47.391Z","updatedAt":"2026-04-22T19:40:53.107Z","lastSeenAt":"2026-04-22T19:40:53.107Z","tsv":"'+3':566 '+7':3358 '-03':2782,2791,3341 '-1':1273 '-100':3384 '-15':2783,2792,3342 '/.../download/report.pdf':901 '/.cache/basecamp':3852 '/.config/basecamp':3826 '/.config/basecamp/accounts.json':4097 '/.config/basecamp/config.json':3992,4073 '/123/blobs/abc/download/report.pdf':1595 '/2914079/buckets/41746046/messages/9478142982#__recording_9488783598':987 '/basecamp':6 '/basecamp/basecamp-cli':4453 '/basecamp/bc3-api#key-concepts':4448 '/buckets/27/card_tables/cards/789':1017 '/buckets/27/card_tables/columns/456':1020 '/buckets/27/documents/303':1032 '/buckets/27/messages/123':1003,1009 '/buckets/27/schedule_entries/404':1035 '/buckets/27/todos/101':1026 '/buckets/27/uploads/202':1029 '/dev/null':3985 '/dir':2657 '/download/f':2666 '/downloads':1580 '/path/to/.basecamp/config.json':3949,3973 '/tmp':839 '/tmp/att':1748 '/tmp/attachments':1770 '0':2949,3383,4321,4378 '00':2785,2794 '00pm':2953 '00z':2786,2795 '1':42,536,1354,1494,1501,1659,2051,2059,2278,2806,2944,3310,3319,3437,3571,4380 '100':3009 '101':1028 '123':1005,1016,1066,1074,1079,1390,1409,4210 '12345':3892 '155':13 '2':78,1376,1700,1750,1853,2441,2807,2945,3311,3320,3438,3576,3579,3591,3596,3984,4386 '20':3770 '202':1031 '2024':2781,2790,3340 '20240315':2770 '25':3433 '27':1008 '3':89,1692,1772,2808,2946,3312,3321,4238,4392 '3.basecamp.com':986 '3.basecamp.com/2914079/buckets/41746046/messages/9478142982#__recording_9488783598':985 '303':1034 '4':100,2947,4398 '404':1038 '42':1303,1318 '42000':1369,1414 '429':4014,4023 '456':1011,1013,1022,1061,1070,1076 '5':108,2948,2952,4403 '50':517,3423 '5mb':3654 '6':208,4416 '60':2992,2995 '67890':3895 '7':4423 '75':956,3415 '789':1019 '8':4432 'accept':111,120 'access':4048,4312 'account':35,266,937,961,964,990,2960,3326,3367,3394,3614,3617,3622,3624,3628,3630,3633,3638,3645,3647,3657,3719,3847,3880,3993,4077,4100 'account-wid':265,936,2959,3325,3366,3393 'account/project':4401 'across':15,248,656,1152,2737,3058,3477 'act':978 'activ':1177,2320,2524,2962,2968,2974,2981,3114,3138,3161,3263 'active/archived/trashed':2858 'ad':2101 'add':818,3308,3313,3741,3743 'address':4351 'agent':36,148,160,299,301,313,341,386,430,441,485,504,1105,1610 'alex':1444 'alic':2589 'all-day':2801,2845 'altern':1754 'alway':355,974,1868,4272 'ambigu':190,1423,1431,1452,2176,4433 'and/or':1638 'annot':1625,1813 'ansi':412 'answer':2883,2886,2889,2891,2914,2917,2924,3289,4145,4159 'api':153,165,1384,4424,4444,4454 'api-coverage.md':4457 'archiv':1181,1183,1236,2323,2332,2361,2527,2536,3081,3082,3096,3100,3120,3139,3152,3154 'archived/trashed':2314,2518 'argument':4102,4168,4176,4188 'array':4285,4368 'as-i':199 'asc':3091 'assign':32,226,228,231,234,598,600,640,694,697,702,705,711,715,903,905,912,914,919,921,1110,1113,1122,1131,1133,1194,1990,1994,2013,2018,2030,2035,3033,3038,3473,3476,3483,3495,3503,3510,3514,3516,3522,3530,3538 'assigne':463,511,557,629,669,1186,1305,1944,1976,2009,2028,2046,2077,2145,2248,3043 'assum':106 'async':3217 'attach':826,828,834,836,847,850,854,1370,1582,1608,1622,1637,1640,1666,1675,1677,1683,1693,1697,1705,1713,1724,1747,1767,1838,1850,1864,1867,1886 'attachments/description_attachments':1727 'attribut':1647 'auth':4010,4032,4035,4037,4043,4053,4091,4094,4393,4396 'authent':4028,4041 'author':3621,3913 'auto':362,542,2644,3692,3857 'auto-detect':361,2643 'auto-manag':3856 'auto-pagin':541 'autom':339 'automat':128,4019,4415 'avail':144,2081,2183,3775,4099 'backoff':4018 'bah7cekicg':1372,1395 'bare':3508 'base':3849,3915,3995,4080 'basecamp':1,5,7,83,224,230,236,242,251,257,261,439,447,458,484,515,524,534,596,599,601,604,607,609,611,618,626,638,650,664,679,690,696,704,714,723,731,739,744,751,758,772,782,791,800,812,820,827,835,842,853,859,865,871,880,888,896,904,913,920,925,931,939,945,952,963,969,982,1056,1077,1094,1112,1120,1132,1139,1144,1154,1164,1200,1207,1219,1227,1233,1240,1247,1276,1287,1292,1299,1311,1313,1328,1340,1359,1388,1407,1432,1439,1446,1473,1482,1496,1514,1534,1557,1573,1575,1590,1601,1668,1696,1719,1766,1824,1837,1849,1907,1913,1919,1925,1933,1941,1949,1956,1963,1971,1980,1986,1989,2000,2012,2020,2029,2038,2047,2055,2068,2104,2111,2117,2124,2131,2189,2196,2208,2216,2229,2235,2241,2250,2259,2272,2285,2299,2328,2363,2394,2400,2407,2412,2419,2424,2430,2436,2442,2448,2459,2468,2475,2481,2486,2494,2500,2507,2514,2532,2575,2584,2594,2599,2603,2611,2619,2629,2637,2647,2653,2662,2671,2680,2689,2695,2702,2709,2718,2741,2746,2753,2760,2766,2774,2797,2810,2824,2833,2863,2869,2875,2881,2887,2893,2903,2912,2922,2956,2963,2969,2975,2982,2988,3024,3036,3052,3060,3070,3077,3084,3092,3143,3150,3155,3162,3170,3179,3184,3190,3198,3204,3209,3218,3236,3243,3249,3253,3260,3265,3270,3292,3297,3302,3306,3315,3330,3336,3345 'basecamp/config.json':104,219,575,591,3888,3945,3983 'bash':438,514,981,1042,1249,1293,1324,1353,1424,1467,1574,1667,1710,1757,1828,1906,1932,2103,2188,2393,2418,2467,2574,2593,2618,2745,2862,2955,3051,3142,3178,3235,3291,3329,3386,3493,3565,3615,3664,3711,3754,3780,3897,3939,3981,4003,4030,4067,4089,4193,4280 'bc3':4049 'behavior':1103 'binari':4270 'block':136,3924 'blue':2447 'board':2570,2573 'bob@x.com':2590 'bodi':116,785,803,2238,2484,2505,2700,4122 'bold':133 'bool':475 'bot':2577 'breadcrumb':324,1896,4320 'breaker':3865 'brows':254,1158,3031 'browser':1805 'built':282,418,4251,4260 'built-in':281,417,4250,4259 'bulk':1320 'buy':4109 'cach':3854,3862 'call':154,166,1385 'callback':4062 'cannot':551,671,1188,2382,3014,3046 'cap':518,3001 'card':17,195,507,703,707,712,743,745,750,752,757,759,767,773,1018,1025,1172,1464,1474,1479,1483,1488,1497,1504,1515,1522,1535,1543,1555,1558,1567,1614,1684,2015,2019,2023,2027,2036,2138,2141,2151,2164,2170,2177,2190,2195,2197,2200,2209,2213,2217,2225,2230,2233,2236,2242,2251,2260,2265,2273,2280,2286,2300,2315,2316,2321,2326,2330,2339,2340,2356,2368,2387,2390,2395,2401,2405,2408,2413,2420,2425,2431,2437,2443,2449,2460,3086,3094,3101,3107,3286,3794,3796,4114,4333 'card-tabl':1554,1566,2169,2199,2224,2264,2279,3795 'cards/messages':2083 'cat':3982,4072,4096 'category-skills' 'cc':1442 'certain':2941 'chang':1215,1231 'charact':4240 'chat':30,811,813,1314,1447,3663,3666,3670,3672,3679,3684,3695,3701,4126 'check':22,101,1396,1415,1664,2860,3221,3687,3979,4007,4034,4068,4098,4383,4400,4419,4429 'check-in':21,2859 'checkin':2864,2870,2876,2882,2888,2894,2904,2913,2923,4144,4158 'checklist':2392 'choos':43,271 'circuit':3864 'claud':1785 'clean':1346 'cli':11,124,424,3806,4008,4016,4180,4256,4449,4460 'client':2155,3169,3176,3842 'client-sid':2154 'client.json':3840 'clone':3931 'cmd':4322 'code':135,1245,4057,4170,4201,4216,4374 'collect':1635 'collid':1848 'color':957,2445,2446,3379,3416,3424,3462 'column':1021,1469,1475,1481,1493,1513,1531,1552,1561,2211,2215,2218,2222,2240,2256,2298,2313,2343,2372,2416,2421,2426,2432,2438,2444,2450,2461,2465 'combin':552,3016 'comma':2555 'comma-separ':2554 'command':9,215,428,437,444,491,497,615,1628,1657,1709,1860 'comment':90,99,118,819,821,997,1012,1041,1043,1054,1068,1072,1078,1171,1254,1277,1339,1345,1389,1408,1433,2073,2592,2595,2600,2604,2612,3106,3258,3279,3793,4132,4208 'commit':1251,1263,1278,1279,3872 'common':1242 'complet':737,918,922,1238,1284,1336,1344,1960,1962,1983,2072,2338,2349,2355,2389,2410,3135,3230,3511,3513,3861,4293,4339 'completed/incomplete':2085 'completion.json':3859 'compos':182,378 'concept':4445 'config':366,3871,3887,3899,3902,3907,3911,3922,3934,3941,3947,3952,3955,3961,3963,3969,3971,3991,4071 'config.json':3844,3875 'configur':3804,3989 'connect':4011,4420 'construct':3211,3220,3223,3225 'contain':1618,1648,1862,2094,4076 'content':109,119,139,196,1085,1212,1636,1682,1726,1863,1882,2636,2723,4112,4130,4147,4242 'context':102,1810,1874,3980 'contract':314 'control':1902 'convert':125 'count':406 'coverag':12,4455 'creat':721,729,733,749,874,950,954,1024,1294,1921,1924,2097,2119,2123,2126,2403,2427,2492,2543,2674,2683,2692,2698,2705,2712,2776,2799,2812,2896,2915,3088,3192,3195,3215,3251,3255,3338,3343,3347,3413,3421,3431,4139,4146,4160,4209 'credenti':3832 'credentials.json':3833 'cross':221,593,636,648,662,688,1149,1162,3021,3028 'cross-project':220,592,635,647,661,687,1148,1161,3020,3027 'curl':4236 'current':561,1512,2297,3731 'custom':3435,3470 'data':54,279,307,322,345,381,670,1187,1363,3044,3136,3825,4284,4291,4301,4308,4337,4346 'data-on':306 'dataset':533 'date':571,2769,2843,3351,3491,4150 'day':2803,2847,2932,2942,2943 'dcr':3841 'dd':4154 'decis':1082 'default':466,476,520,556,642,1101,1126,1175,1742,2919,3008,3112,3627,3877,3917,4164 'delet':3206,3272,3361,3447,3702,3705 'depend':364 'desc':2129 'describ':435 'descript':1639,1674,1866,2128,3426,3443 'design':1626,1814 'detail':962,1918,2116,2234,2765,2880,2892,3189,3248,3410,3634,3738 'detect':363,2645 'determinist':146,1352 'dev':4070 'devic':4056 'device-cod':4055 'diagnost':4002 'differ':2066 'dir':1740,2661 'direct':157,207,1803,3090 'directori':3809 'disabl':3269,3458,3460 'disambigu':1462 'display':383,4059 'doc':2628,2697,2699,2704,2711,3083 'doctor':4005,4422,4431 'document':193,1033,1170,1616,2617,2728,3079,3105,3280,3798 'domain':502 'domain-specif':501 'done':740,1241,1286,1288,1312,1450,1981,2074,2263,2276,2342,2579 'donecolumn':2347 'download':833,837,841,846,855,878,882,890,893,898,1570,1577,1581,1592,1603,1656,1695,1698,1704,1712,1715,1723,1736,1746,1755,1758,1768,1801,1839,1851,1869,1885,1892,2649,2651,2655,2658,2664,2667 'download-attach':845,1711,1722,1745,1884 'draft':2488,2490,2493,2499,2542,2545,2706,2707 'dri':1333 'drill':493 'dry-run':1332 'due':563,565,567,915,1134,1307,1978,2088,2246,2838,2842,3490,3517,3523,3524,3527,3531,3532,3535,3539,3540,3545,3551,3553,3555,3559,3562 'due-dat':3489 'e.g':506,3137 'echo':3986 'either':554 'elicit':4192 'email':2558,4349,4350 'emb':155,179 'empti':3196 'enabl':2454,3450,3452 'end':2788,2818 'endpoint':14 'ends-at':2787,2817 'entri':1037,1728,2755,2759,2764,3284 'envelop':296,311,320,347,399,4313 'ephemer':3855 'error':348,400,1456,2179,3999,4024,4029,4064,4088,4169,4184,4199,4214,4219,4382,4394,4418,4425 'escap':4248 'event':655,2736,2777,3010,3274 'everi':2910,2931,2933,2935,2938,2994 'everyon':3467 'everyth':3007 'except':223,595 'exclus':549,2563,2856 'exist':4391 'exit':4237,4373,4375 'expect':374 'explicit':360,3926 'extern':73,287,4268,4278 'extract':87,1223,4281 'fals':350,402,477,4198,4213,4294 'featur':4116 'fetch':526,1660,1714,1891,2149,3006 'field':110,1229,1633,1652,1690,2376,4220,4282 'field-scop':1632 'file':19,856,870,872,879,881,885,889,897,1571,1576,1591,1602,1621,1735,1779,1790,1840,2616,2620,2627,2630,2638,2648,2652,2654,2663,2672,2677,2681,2690,2696,2703,2710,2719,3953 'file-read':1778,1789 'filter':285,292,297,303,421,512,672,1189,2146,2153,3048,3110,4254,4329 'filter/extract':53,277 'find':1084,1088 'first':81,537 'first.last':184,795,1428,1460 'fix':4377 'flag':275,461,469,2076,2541,2732,2844,4106,4136,4263 'flat':92,1045 'folder':2626,2635,2688,2691,2693,2726 'follow':39,1894 'forbidden':4399 'forc':411,3704 'format':131,276,372,1274,3851,3997,4371 'found':4087,4388 'four':140 'fragment':1000,1071 'frequenc':2909,2930,4027 'full':10,57,315,1197,3760,4046,4047 'full-text':1196,3759 'fuzzi':185,1425 'fyi':2586 'gaug':31,262,268,612,935,940,943,946,953,3373,3374,3388,3392,3397,3406,3412,3420,3430,3441,3446,3449,3453,3457,3461 'gemini':1786 'general':4001 'generic':3778,3802 'get':1250,1471,2174,3134,3232 'gfm':333 'git':1264,1271,3874 'github.com':4447,4452 'github.com/basecamp/basecamp-cli':4451 'github.com/basecamp/bc3-api#key-concepts':4446 'global':3845,3990 'goal':274 'gojq':4266 'good':2607 'green':958,3417,3463 'group':1099,3487 'halfway':3427 'handl':4000,4017,4411 'haven':2358 'head':1269 'headless':389,4058 'health':4009 'hello':3681,4128 'help':431,442,486,1106,4385 'hey':794,1391,1410 'hidden':3173 'hide':3174 'hint':505,1653,1691,1897,2181,4203 'hold':771,777,1508,1519,1526,1540,1547,1565,2290,2295,2305,2310,2453,2457 'html':127,206,4249 'human':65 'id':88,163,169,404,698,706,716,830,991,993,996,998,1051,1055,1065,1069,1224,1226,1368,1402,1472,1533,1982,1991,2002,2014,2022,2031,2040,2061,2185,2258,2559,3226,3601,3848,3879,3881,3883,3891,3894,3905,3910,3994,4078,4309,4438 'id/url':4390 'ident':3815,3828 'identifi':2337,2354 'ids-on':403 'imag':1619,1774,1802,1832 'impli':290,4353 'import':1820,1878 'in':23,2861 'inact':3268 'includ':498,1673,1730,2837,2840,3042,3099 'include-du':2836 'index':1495,1845,1852 'indic':2384 'info':1252,2748,2752,2868 'inherit':468 'init':3900 'initi':3896 'inlin':177,385 'instead':77,1195,4439 'integr':390 'interact':353,1420 'interv':2991 'introspect':425 'invari':37 'item':1184,2642 'j':473 'jane':1366,1374,1392,1411,1443,1449 'jane.smith':1434,2605,3686 'jq':48,74,76,280,284,288,302,416,420,1362,4253,4262,4269,4274,4279,4290,4300,4307,4319,4327,4336,4345,4352 'json':55,58,278,291,316,318,319,344,357,397,434,443,471,621,632,641,653,667,684,693,701,710,720,728,736,741,748,755,765,779,787,797,808,817,824,832,848,862,868,877,906,917,923,927,934,942,949,960,966,988,1062,1097,1114,1123,1136,1141,1147,1157,1166,1203,1210,1477,1671,1725,1910,1916,1923,1937,2108,2122,2193,2220,2472,2598,2623,2744,2750,2757,2866,2958,2966,2972,2978,3055,3064,3098,3181,3187,3240,3390,3400,3408,3496,3505,3512,3519,3526,3534,3544,3568,3577,3583,3592,3619,3632,3643,3650,3660,3668,3675,3715,3724,3730,3736,3758,3774,3784,3889,4006,4196,4211,4354,4372 'kanban':2139,2346,3285 'key':1641,1855,3914 'know':1090 'larg':532 'later':3541,3546,3556,3563 'launch':3348 'layer':4410 'learn':4442 'length':4302 'level':490 'like':2147 'limit':516,546,2089,2362,2998,3635,3769,4013,4405 'line':3696,3699,3706 'lineup':29,3324,3331,3337,3346,3354,3360,3363 'link':134,1244 'list':132,263,336,613,616,620,628,681,727,742,746,825,829,941,1095,1102,1468,1909,1911,1935,1938,1943,1951,1958,1965,1966,1970,1975,2060,2067,2087,2106,2109,2191,2198,2210,2221,2317,2398,2470,2473,2521,2596,2621,2624,2631,2634,2758,2873,2885,3182,3238,3241,3332,3333,3389,3504,3569,3574,3613,3618,3620,3669,3676,3714,3722,3957,4288,4298,4305,4317,4325,4334,4344 'live':2985 'llms':1784 'local':1734 'local/repo':3921 'localhost':4065,4085 'log':1272,3839 'login':4038,4044,4054,4397 'logo':3648,3652,3658,3662 'long':450 'look':1355,2606 'lookup':1404,3803 'm':332 'malform':4235 'manag':2417,3141,3858 'mandatori':212 'mark':928,3584,3593 'markdown':112,121,130,338,1380 'marker':3328,3335,3344,3364 'match':312,1426,3609 'max':3655 'may':188,368,528,1421,1617,1685,3129 'md':59,331,359,376 'mean':4376 'meet':2800 'mention':114,141,150,790,1349,1381,1394,1418,2610,3691 'merg':1310,1316 'messag':18,115,781,783,792,801,815,1004,1015,1169,1440,1612,1827,2466,2469,2474,2476,2480,2482,2487,2495,2501,2508,2515,2519,2520,2525,2530,2534,2569,2576,2585,3072,3074,3104,3278,3673,3677,3792,4120 'message-board':2568 'messages/123':1059 'messages/documents':1680 'meta':325 'meta.stats.requests':4328 'metadata':3773,4314 'mileston':3339 'milk':4110 'miss':4167,4178,4223 'mm':4153 'mockup':1623,1811 'mockup.png':1841 'mode':47,68,270,273,300,393 'modif':2380 'modifi':1211 'monitor':2986 'month':2939 'move':756,760,766,774,1463,1478,1484,1487,1498,1503,1516,1521,1536,1542,1559,2052,2064,2252,2254,2261,2267,2274,2282,2287,2291,2301,2306,2370,2439,3147 'msg':1270,1282 'multimod':1609,1783 'multipl':1984,1998,2010,2163,2207,2228,2572 'must':38,2167 'mutual':548,2562,2855 'n':763,2999 'name':149,161,183,186,454,462,470,734,1365,1373,1453,1551,1562,1847,1922,1928,2062,2120,2127,2134,2187,2269,2428,2557,3194,3201,3203,3212,3357,3640,3642,4185,4221,4347,4348,4441 'namespac':3810 'nativ':1777 'natur':570,3350 'navig':426 'nearest':3944,3968 'need':51,289,1086,1589,1806,2158,2223,2270,3130,4356 'needl':944,947,951,3380,3398,3401,3407,3409 'network':4063,4417 'never':70,3836 'new':1929,2135,2245,2435,2504,2722,2828,2907,3202,3213,3356,3641,4115 'next':568,3560 'no-subscrib':804,2546,2565,2580,2714,2820,2850 'non':909,1117,3500 'non-prior':908,1116,3499 'note':452,499,582,1174,2140,2587,2713,3362,3597 'notic':1651,1689 'notif':33,258,260,610,924,926,929,932,1138,1140,2551,3564,3567,3573,3581,3588,3600 'notifi':2804,2848,3434,3466 'numer':1532,2257 'oauth':3834,3937,4050 'object':351,4366 'occurr':2772 'often':1817,1876 'ok':321,349,401,1985,1999,2011,4197,4212,4379 'omit':3800,4162 'on-hold':769,775,1506,1517,1524,1538,1545,1563,2288,2293,2303,2308,2451,2455 'one':164,1403,1702,1717,1889 'one-shot':1701,1888 'oper':3824 'option':2929,4156 'os':1738 'output':46,67,269,317 'overdu':238,240,603,675,682,685,692,911,916,1130,1135,1151,1156,1322,1326,1331,1343,1952,1954,2071,2086,3518,3520,3550 'page':535,538,550,3013,3570,3575,3578,3590,3595,3605,3607,3611 'pagin':513,543,2731,3067 'parent':95,1049,1067 'parent.type':2345 'pars':79,85,572,863,867,973,975,984,1058,1209,1221,1267,3352 'part':1821 'particip':2805,2849 'pass':356,4358 'past':4061 'path':446,457,1731,1795,3978 'pattern':1002,1856 'payload':309 'peopl':1350,1360,1419,2553,2854,3309,3314,3318,3323,3710,3713,3717,3721,3725,3734,3740,3747,4343 'per':3869,3885 'per-repo':3868,3884 'perman':3707 'permiss':4402 'persist':4428 'person':162,168,674,1191,1358,1401,1413,2977,2979,3050,3737 'pin':2509,2511 'pingabl':173,1361 'pipe':71,1600,1836,4276 'pipelin':181 'plain':203,4244,4364 'pleas':1435 'png/jpeg/gif/webp/avif/heic':3653 'point':1732,4083 'poll':2993,3227 'posit':762,955,1491,1500,2049,2057,2277,2284,2440,3414,3422,3432,4104,4175 'post':780,788,798,809,814,1315,1387,1406,1448,3680,3685,4127 'power':4264 'pr':1290,1297,1302,1317 'prefer':145,158,1351,3035,3846,3998,4273 'present':61,1679 'prevent':3929 'preview':1325 'print':4362,4369 'printf':1258,1280 'prioriti':907,910,1115,1118,3486,3498,3501 'process':1321 'produc':370 'profil':3918,3919 'progress':1763,3377 'project':107,209,222,250,573,586,594,617,619,625,637,649,658,663,678,689,992,1007,1093,1150,1153,1163,1905,1908,1914,1920,1926,1940,2161,2739,2967,3022,3029,3059,3076,3214,3216,3233,3371,3376,3404,3455,3479,3723,3727,3742,3745,3749,3752,3817,3876,3878,3890,3904,3988 'project-scop':3370 'prompt':354,4227 'proper':4247 'provid':3484 'publish':2496,2497 'q':1259 'queri':584,861,1202,3125,3132,3757,3765 'question':2871,2874,2877,2879,2895,2905,2908,3287,3288,4149 'questionnair':2867 'quick':580 'quiet':394 'quot':1262 'rate':4012,4404 'raw':343,396 're':4040 're-authent':4039 'read':930,933,1780,1791,3582,3586,3589,3598,3831,3837 'record':25,96,252,608,665,995,1010,1050,1060,1064,1165,1234,1662,2329,2533,3019,3025,3039,3053,3061,3071,3078,3085,3093,3115,3144,3151,3156,3163,3171,3787 'recur':2773 'red':3465 'redirect':3936 'reduc':1430,4025 'refer':581,1904 'registr':3843 'relationship':3818 'reliabl':2383 'remov':2005,2026,2044,3317,3322,3659,3661,3748,3750,4079 'renam':3644 'reopen':1987 'repli':93,1039,1046,1080 'repo':3870,3886,3932,4450,4461 'report':225,237,243,379,597,602,605,639,651,691,1121,1145,1155,1193,2742,3037,3482 'request':4026 'requir':585,1553,2205,4101,4174,4200,4215,4271 'resili':3863,4409 'resolut':187 'resolv':167,559,3599 'resourc':523,1903 'respons':1672,1798,1861 'restor':1237,3157,3159 'result':62,327,384,519,3002,4361 'retri':4408,4413,4426 'retry-aft':4412 'return':432,989,1063,1454,2319,2523,3117,3224,4181 'rev':1266 'rev-pars':1265 'review':1301,1436 'revok':3965,3974 'rich':138,1645 'rich-text':1644 'right':45 'root':2679 'rule':41 'run':293,304,1334 'safe':1261 'scale':3385 'schedul':20,244,247,606,646,652,1036,1143,1146,2733,2743,2747,2751,2754,2761,2767,2775,2798,2811,2825,2834,2928,3283 'scope':210,587,1634,3372,3492,3549,3777,4045 'screenshot':1624,1812 'script':340,391 'search':858,860,1199,1201,3753,3756,3762,3764,3772,3776 'second':2996 'section':1509,1527,1548,2458 'see':66,422,4022,4456 'select':1364,1843,4292,4338 'sent':198 'separ':1756,2556,3131,3480 'session':408 'set':174,2835,3626,3903,3908 'sgid':151,156,171,175,178,1371,1378 'short':449,456,1268 'shorthand':472 'shot':1703,1718,1890 'show':326,840,844,965,1627,1670,1708,1721,1762,1859,1915,1917,2113,2115,2182,2231,2422,2477,2479,2639,2641,2762,2768,3167,3186,3245,3631,3698,3735,3779,3782,3785,3958 'side':2156 'silent':799,2549 'singl':1831 'skill':2,3 'slow':530 'smart':555 'smith':1367,1375,1393,1412 'someth':1089,1216 'sort':3087,3766 'source-basecamp' 'special':4239 'specif':503,1490,1530,1969,2203,2660,2771,3823,3951,3977,4187,4232,4436 'specifi':579,1744,2168,3604 'start':482,2779,2815,2831 'starts-at':2778,2814,2830 'stat':407 'state':3866 'statist':409 'status':1178,1180,1232,1959,2084,2331,2335,2535,2539,2857,3080,3095,3109,3119,3122,3127,3140,3222,3229,4033,4092,4311 'stderr':1765 'stdout':852,887,1598,1834 'step':713,717,1658,1699,1749,1753,1771,1901,2032,2037,2041,2045,2391,2396,2399,2402,2404,2409,2414 'storag':894,1585,2665,2669 'storage.3.basecamp.com':900,1594 'storage.3.basecamp.com/.../download/report.pdf':899 'storage.3.basecamp.com/123/blobs/abc/download/report.pdf':1593 'stream':849,884,1596,1829 'string':465,4360 'structur':233,337,433,3485,4183 'style':410 'subcommand':453,496,2725 'subject':4121,4124 'subscrib':806,2463,2548,2552,2567,2582,2588,2716,2822,2852,2853,3296,3299,3300 'subscript':28,3290,3293,3298,3303,3307,3316,3436,3472,3636 'success':342,395 'suggest':1458 'summar':380 'summari':323,2827 'sun':2950 'support':510,2144 'surfac':1629,1808 'sweep':455,460,1330,1342,2070 'sync':2813 'syntax':122,142,1382 't09':2784 't10':2793 'tab':3860 'tabl':334,1556,1568,2165,2171,2178,2184,2201,2204,2226,2266,2271,2281,3797 'target':2312 'task':335,614,725,1973 'temp':1739 'templat':26,3177,3180,3183,3185,3188,3191,3193,3197,3199,3205,3208,3210,3219 'text':204,822,1198,1646,1881,2601,3761,4133,4245,4365 'text/html':3693 'time':2951 'timelin':24,968,970,2954,2957,2964,2970,2976,2983,2989 'titl':753,784,793,802,2237,2244,2434,2483,2503,2721,2829,4118,4295,4310,4341 'to-do':1995,2006 'today':2921,3525,3528,3552,4166 'todo':16,192,241,440,445,448,459,623,627,634,660,666,676,680,686,695,722,724,738,843,1027,1168,1239,1248,1256,1295,1300,1323,1327,1329,1341,1613,1669,1720,1825,1931,1934,1942,1948,1950,1957,1964,1972,2048,2056,2069,2078,2096,2102,2148,3034,3054,3057,3062,3066,3103,3257,3276,3790,4108,4195,4206,4287,4297,4304,4316,4324 'todolist':730,732,2091,2092,2099,2105,2110,2112,2118,2125,2132,3277,3791,3882,3893,3909 'todos/cards':2841 'token':3835,3938 'tomorrow':564,1308,1979,2247,3349,3533,3536,3554 'tool':1781,1792,3822,3853 'tool-specif':3821 'top':489,2054,2513 'top-level':488 'track':1289,2366,3375 'tradit':1124 'transform':4331 'trash':1235,2325,2336,2529,2540,3123,3145,3149,3207 'trashabl':3709 'tree':481,1083 'true':2350,4340 'trust':3912,3927,3942,3943,3948,3950,3956,3960,3966,3975 'tui':2987 'two':1752,1900,3808 'two-step':1751,1899 'type':256,464,474,994,1092,1160,1167,2646,3030,3102,3256,3275,3788,3789 'unassign':2001,2021,2039 'uncomplet':1988,2415 'unfamiliar':427 'unpin':2516,2517 'unsubscrib':3304,3305 'unsur':1108 'untrust':3964,3972 'upcom':246,654,1142,2735 'updat':1228,1441,1927,1930,2133,2137,2243,2374,2377,2433,2502,2506,2578,2613,2614,2720,2724,2826,2906,2925,2926,3200,3262,3267,3355,3442,3444,3639,3767 'upload':869,873,1173,2673,2676,2682,2686,2727,3108,3281,3649,3651 'upload/file':1030 'url':80,84,831,864,866,895,972,976,983,1001,1057,1206,1208,1218,1220,1586,2063,2670,3850,3916,3996,4060,4066,4142,4234 'url/api_url':4081 'usag':451,467,478,4171,4202,4204,4217,4381 'use':75,129,202,375,1104,1179,1192,1222,1257,1377,1400,1427,1459,1681,1787,1883,2327,2351,2531,2740,2997,3023,3118,3606,3625,3807,4189,4224,4243,4437 'user':330,562,3732,4229 'v':413 'valu':176,1230,4233 'vari':521 'vault':875,2632,2684,3282 'verbose/trace':415 'verifi':4093,4389 'via':103,172,216,588 'view':235,1125,1773,1800,1871,3474 'visibl':3164,3165,3172 'visual':1809,1873 'vv':414 'wait':4406 'walk':479 'want':1213 'watch':967,971,2462,2984,2990,3018 'webhook':27,3234,3237,3242,3244,3247,3250,3254,3261,3266,3271,4138 'week':569,2911,2934,2937,3543,3548,3558,3561 'wide':267,938,2961,3327,3368,3395 'wip':2489 'work':229,1111,1298,1606,2900,3468,4095 'workflow':8,1243,1466,1611 'yellow':3425,3464 'yyyi':4152 'yyyy-mm-dd':4151 'zero':152,1383","prices":[{"id":"e485afac-c710-45f3-977a-fdd8f24a4d31","listingId":"81fab936-0a36-4905-b9ea-7accb70777c2","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"basecamp","category":"skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:35:47.391Z"}],"sources":[{"listingId":"81fab936-0a36-4905-b9ea-7accb70777c2","source":"github","sourceId":"basecamp/skills/basecamp","sourceUrl":"https://github.com/basecamp/skills/tree/main/skills/basecamp","isPrimary":false,"firstSeenAt":"2026-04-18T22:22:37.907Z","lastSeenAt":"2026-04-22T18:59:01.085Z"},{"listingId":"81fab936-0a36-4905-b9ea-7accb70777c2","source":"skills_sh","sourceId":"basecamp/skills/basecamp","sourceUrl":"https://skills.sh/basecamp/skills/basecamp","isPrimary":true,"firstSeenAt":"2026-04-18T20:35:47.391Z","lastSeenAt":"2026-04-22T19:40:53.107Z"}],"details":{"listingId":"81fab936-0a36-4905-b9ea-7accb70777c2","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"basecamp","slug":"basecamp","source":"skills_sh","category":"skills","skills_sh_url":"https://skills.sh/basecamp/skills/basecamp"},"updatedAt":"2026-04-22T19:40:53.107Z"}}