npx skills add https://github.com/basecamp/skills --skill basecamp完整 CLI 覆盖:涵盖待办事项、卡片、消息、文件、日程安排、签到、时间线、记录、模板、Webhooks、订阅、阵容和 Campfire 的 130 个端点。
必须遵守以下规则:
--json 以获得结构化、可预测的输出basecamp url parse "<url>" 提取 ID.basecamp/config.json--in <project> 或 .basecamp/config.json。没有跨项目查询模式。对于跨项目数据,请使用 basecamp recordings <type> 或逐个循环遍历项目。广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
basecamp <cmd> --json # 包含数据、摘要、面包屑导航的 JSON 信封(推荐)
basecamp <cmd> --quiet # 仅原始 JSON 数据,无信封
basecamp <cmd> --agent # 机器可读,无交互式提示
basecamp <cmd> --ids-only # 仅 ID,每行一个
basecamp <cmd> --count # 仅计数
basecamp <cmd> --stats # 在输出中包含会话统计信息
basecamp <cmd> --limit 50 # 限制结果数量(默认值因资源而异)
basecamp <cmd> --all # 获取所有结果(对于大型数据集可能较慢)
basecamp <cmd> --page 1 # 仅第一页,无自动分页
--all 和 --limit 是互斥的。--page 不能与两者中的任何一个结合使用。
--assignee me 解析为当前用户--due tomorrow / --due +3 / --due "next week" - 自然日期解析--in,则从 .basecamp/config.json 获取项目注意: 大多数查询需要项目范围(通过
--in <project>或.basecamp/config.json)。对于跨项目数据,请使用basecamp recordings <type>或逐个循环遍历项目。
| 任务 | 命令 |
|---|---|
| 列出项目 | basecamp projects --json |
| 我的待办事项(在项目中) | basecamp todos --assignee me --in <project> --json |
| 所有待办事项(跨项目) | basecamp recordings todos --json(在客户端过滤) |
| 逾期待办事项 | basecamp todos --overdue --in <project> --json |
| 创建待办事项 | basecamp todo --content "Task" --in <project> --list <list> --json |
| 创建待办事项列表 | basecamp todolists create --name "Name" --in <project> --json |
| 完成待办事项 | basecamp done <id> --json |
| 列出卡片 | basecamp cards --in <project> --json |
| 创建卡片 | basecamp card --title "Title" --in <project> --json |
| 移动卡片 | basecamp cards move <id> --to <column> --in <project> --json |
| 发布消息 | basecamp message --subject "Title" --content "Body" --in <project> --json |
| 发布到 Campfire | basecamp campfire post --content "Message" --in <project> --json |
| 添加评论 | basecamp comment --content "Text" --on <recording_id> --in <project> --json |
| 搜索 | basecamp search "query" --json |
| 解析 URL | basecamp url parse "<url>" --json |
| 下载文件 | basecamp files download <id> --in <project> |
| 监视时间线 | basecamp timeline --watch |
在操作 URL 之前始终先解析它们:
basecamp url parse "https://3.basecamp.com/2914079/buckets/41746046/messages/9478142982#__recording_9488783598" --json
返回:account_id、project_id、type、recording_id、comment_id(来自片段)。
URL 模式:
/buckets/27/messages/123 - 项目 27 中的消息 123/buckets/27/messages/123#__recording_456 - 消息 123 上的评论 456/buckets/27/card_tables/cards/789 - 卡片 789/buckets/27/card_tables/columns/456 - 列 456(用于创建卡片)/buckets/27/todos/101 - 待办事项 101/buckets/27/uploads/202 - 上传/文件 202/buckets/27/documents/303 - 文档 303/buckets/27/schedule_entries/404 - 日程条目 404回复评论:
# 评论是扁平的 - 回复父 recording_id,而不是 comment_id
basecamp url parse "https://...messages/123#__recording_456" --json
# 返回 recording_id: 123(父级),comment_id: 456(片段)- 对 123 的评论,而不是 456
basecamp comment --content "Reply" --on 123 --in <project>
需要查找某些内容?
├── 知道类型 + 项目? → basecamp <type> --in <project> --json
├── 需要跨项目数据? → basecamp recordings <type> --json(唯一的跨项目选项)
│ (类型:todos, messages, documents, comments, cards, uploads)
│ 注意:默认为活动状态;使用 --status archived 获取已归档项目
├── 全文搜索? → basecamp search "query" --json
└── 有 URL? → basecamp url parse "<url>" --json
想要更改某些内容?
├── 有 URL? → basecamp url parse "<url>" → 使用提取的 ID
├── 有 ID? → basecamp <resource> update <id> --field value
├── 更改状态? → basecamp recordings trash|archive|restore <id>
└── 完成待办事项? → basecamp done <id>
# 获取提交信息并评论待办事项(使用 printf %q 进行安全引用)
COMMIT=$(git rev-parse --short HEAD)
MSG=$(git log -1 --format=%s)
basecamp comment --content "Commit $COMMIT: $(printf '%s' "$MSG")" --on <todo_id> --in <project>
# 完成后完成
basecamp done <todo_id>
# 为 PR 工作创建待办事项
basecamp todo --content "Review PR #42" --in <project> --assignee me --due tomorrow
# 合并时
basecamp done <todo_id>
basecamp campfire post --content "Merged PR #42" --in <project>
# 预览逾期待办事项
basecamp todos sweep --overdue --dry-run --in <project>
# 完成所有并添加评论
basecamp todos sweep --overdue --complete --comment "Cleaning up" --in <project>
# 列出列以获取 ID
basecamp cards columns --in <project> --json
# 将卡片移动到列
basecamp cards move <card_id> --to <column_id> --in <project>
basecamp files download <upload_id> --in <project> --out ./downloads
basecamp projects --json # 列出所有
basecamp projects show <id> --json # 显示详细信息
basecamp projects create --name "Name" --json # 创建
basecamp projects update <id> --name "New" # 更新
basecamp todos --in <project> --json # 列出项目中的待办事项
basecamp todos --assignee me --in <project> # 我的待办事项
basecamp todos --overdue --in <project> # 仅逾期
basecamp todos --status completed --in <project> # 已完成
basecamp todos --list <todolist_id> --in <project> # 在特定列表中
basecamp todo --content "Task" --in <project> --list <list> --assignee me --due tomorrow
basecamp done <id> [id...] # 完成(支持多个)
basecamp reopen <id> # 取消完成
basecamp todos position <id> --to 1 # 移动到顶部
basecamp todos sweep --overdue --complete --comment "Done" --in <project>
标志: --assignee(仅限待办事项 - 不适用于卡片/消息)、--status(completed/pending)、--overdue、--list、--due、--limit、--all
待办事项列表是待办事项的容器。在添加待办事项之前先创建待办事项列表。
basecamp todolists --in <project> --json # 列出待办事项列表
basecamp todolists show <id> --in <project> # 显示详细信息
basecamp todolists create --name "Name" --in <project> --json # 创建
basecamp todolists create --name "Name" --description "Desc" --in <project>
basecamp todolists update <id> --name "New" --in <project> # 更新
注意: 卡片不支持像待办事项那样的 --assignee 过滤。如果需要,请获取所有卡片并在客户端过滤。如果项目有多个卡片表,则必须指定 --card-table <id>。当出现“Ambiguous card table”错误时,提示会显示可用的表 ID 和名称。
basecamp cards --in <project> --json # 所有卡片
basecamp cards --card-table <id> --in <project> # 来自特定表的卡片(如果有多个则必需)
basecamp cards --column <id> --in <project> # 列中的卡片
basecamp cards columns --in <project> --json # 列出列(如果有多个则需要 --card-table)
basecamp cards show <id> --in <project> # 卡片详细信息
basecamp card --title "Title" --content "<p>Body</p>" --in <project> --column <id>
basecamp cards update <id> --title "New" --due tomorrow --assignee me
basecamp cards move <id> --to <column_id> # 移动到列(数字 ID)
basecamp cards move <id> --to "Done" --card-table <table_id> # 按名称移动(需要表)
识别已完成的卡片: 在“完成”列中的卡片具有 parent.type: "Kanban::DoneColumn" 和 completed: true。使用此方法来识别尚未归档的已完成卡片。
限制: Basecamp 不跟踪卡片何时在列之间移动。updated_at 字段在任何修改时都会更新,无法可靠地指示卡片何时完成。
卡片步骤(清单):
basecamp cards steps <card_id> --in <project> # 列出步骤
basecamp cards step create --title "Step" --card <id> --in <project>
basecamp cards step complete <step_id> --in <project>
basecamp cards step uncomplete <step_id>
列管理:
basecamp cards column show <id> --in <project>
basecamp cards column create --title "Name" --in <project>
basecamp cards column update <id> --title "New"
basecamp cards column move <id> --position 2
basecamp cards column color <id> --color blue
basecamp cards column on-hold <id> # 启用挂起部分
basecamp cards column watch <id> # 订阅列
basecamp messages --in <project> --json # 列出消息
basecamp messages show <id> --in <project> # 显示消息
basecamp message --subject "Title" --content "Body" --in <project>
basecamp messages update <id> --subject "New" --content "Updated"
basecamp messages pin <id> --in <project> # 置顶
basecamp messages unpin <id> # 取消置顶
标志: --draft(创建为草稿)、--message-board <id>(如果有多个公告板)
basecamp comments --on <recording_id> --in <project> --json
basecamp comment --content "Text" --on <recording_id> --in <project>
basecamp comments update <id> --content "Updated" --in <project>
basecamp files --in <project> --json # 列出所有(文件夹、文件、文档)
basecamp files --vault <folder_id> --in <project> # 列出文件夹内容
basecamp files show <id> --in <project> # 显示项目(自动检测类型)
basecamp files download <id> --in <project> # 下载文件
basecamp files download <id> --out ./dir # 下载到特定目录
basecamp files folder create --name "Folder" --in <project>
basecamp files doc create --title "Doc" --content "Body" --in <project>
basecamp files doc create --title "Draft" --draft --in <project>
basecamp files update <id> --title "New" --content "Updated"
子命令: folders、uploads、documents(每个都支持分页标志)
basecamp schedule --in <project> --json # 日程信息
basecamp schedule entries --in <project> --json # 列出条目
basecamp schedule show <id> --in <project> # 条目详细信息
basecamp schedule show <id> --date 20240315 # 特定发生时间(重复)
basecamp schedule create "Event" --starts-at "2024-03-15T09:00:00Z" --ends-at "2024-03-15T10:00:00Z" --in <project>
basecamp schedule create "Meeting" --all-day --notify --participants 1,2,3 --in <project>
basecamp schedule update <id> --summary "New title" --starts-at "..."
basecamp schedule settings --include-due --in <project> # 包含待办事项/卡片的截止日期
标志: --all-day、--notify、--participants <ids>、--status(active/archived/trashed)
basecamp checkins --in <project> --json # 问卷信息
basecamp checkins questions --in <project> # 列出问题
basecamp checkins question <id> --in <project> # 问题详细信息
basecamp checkins answers <question_id> --in <project> # 列出答案
basecamp checkins answer <id> --in <project> # 答案详细信息
basecamp checkins question create --title "What did you work on?" --in <project>
basecamp checkins question update <id> --title "New question" --frequency every_week
basecamp checkins answer create --question <id> --content "My answer" --in <project>
basecamp checkins answer update <id> --content "Updated" --in <project>
日程选项: --frequency(every_day, every_week, every_other_week, every_month, on_certain_days)、--days 1,2,3,4,5(0=周日)、--time "5:00pm"
basecamp timeline --json # 账户范围内的活动
basecamp timeline --in <project> --json # 项目活动
basecamp timeline me --json # 您的活动
basecamp timeline --person <id> --json # 人员的活动
basecamp timeline --watch # 实时监控(TUI)
basecamp timeline --watch --interval 60 # 每 60 秒轮询一次
注意: basecamp timeline(账户范围内)工作可靠。时间线命令不支持 --limit 标志。
使用 basecamp recordings <type> 进行跨项目查询 - 这是在一次调用中跨所有项目查询的唯一方式。
basecamp recordings todos --json # 所有项目中的所有待办事项
basecamp recordings todos --all --json # 所有待办事项(分页获取所有)
basecamp recordings messages --in <project> # 项目中的消息
basecamp recordings documents --status archived # 已归档的文档
basecamp recordings cards --sort created_at --direction asc
basecamp recordings cards --status archived --all --json # 包含已归档的卡片
类型: todos、messages、documents、comments、cards、uploads
状态过滤: 默认情况下,仅返回 active 记录。使用 --status archived 或 --status trashed 查询其他状态。您可能需要单独的查询来获取完整数据(例如,活动 + 已归档)。
状态管理:
basecamp recordings trash <id> --in <project> # 移动到回收站
basecamp recordings archive <id> --in <project> # 归档
basecamp recordings restore <id> --in <project> # 恢复到活动状态
basecamp recordings visibility <id> --visible --in <project> # 对客户可见
basecamp recordings visibility <id> --hidden # 对客户隐藏
basecamp templates --json # 列出模板
basecamp templates show <id> --json # 模板详细信息
basecamp templates create "Template Name" # 创建空模板
basecamp templates update <id> --name "New Name"
basecamp templates delete <id> # 删除模板到回收站
basecamp templates construct <id> --name "New Project" # 创建项目(异步)
basecamp templates construction <template_id> <construction_id> # 检查状态
Construct 返回 construction_id - 轮询直到 status="completed" 以获取项目。
basecamp webhooks --in <project> --json # 列出 webhooks
basecamp webhooks show <id> --in <project> # Webhook 详细信息
basecamp webhooks create --url "https://..." --in <project>
basecamp webhooks create --url "https://..." --types "Todo,Comment" --in <project>
basecamp webhooks update <id> --active --in <project>
basecamp webhooks update <id> --inactive # 禁用
basecamp webhooks delete <id> --in <project>
事件类型: Todo, Todolist, Message, Comment, Document, Upload, Vault, Schedule::Entry, Kanban::Card, Question, Question::Answer
basecamp subscriptions <recording_id> --in <project> # 谁订阅了
basecamp subscriptions subscribe <id> --in <project> # 订阅自己
basecamp subscriptions unsubscribe <id> # 取消订阅
basecamp subscriptions add <id> --people 1,2,3 # 添加人员
basecamp subscriptions remove <id> --people 1,2,3 # 移除人员
basecamp lineup create "Milestone" "2024-03-15" # 创建标记
basecamp lineup create --name "Launch" --date tomorrow
basecamp lineup update <id> --name "New Name" --date "+7"
basecamp lineup delete <id>
注意: 阵容标记是账户范围内的,不是项目范围的。
basecamp campfire --in <project> --json # 列出 campfires
basecamp campfire messages --in <project> --json # 列出消息
basecamp campfire post --content "Hello!" --in <project>
basecamp campfire line <line_id> --in <project> # 显示行
basecamp campfire delete <line_id> --in <project> # 删除行
basecamp people --json # 账户中的所有人员
basecamp people --in <project> --json # 项目上的人员
basecamp me --json # 当前用户
basecamp people show <id> --json # 人员详细信息
basecamp people add <id> --in <project> # 添加到项目
basecamp people remove <id> --in <project> # 从项目中移除
basecamp search "query" --json # 全文搜索
basecamp search "query" --sort updated_at --limit 20
basecamp search metadata --json # 可用的搜索范围
basecamp show <type> <id> --in <project> --json # 显示任何记录类型
# 类型:todo, todolist, message, comment, card, card-table, document(或省略 <type> 进行通用查找)
CLI 使用两个目录命名空间:basecamp 用于您的 Basecamp 身份和项目关系,basecamp 用于工具特定的操作数据。
~/.config/basecamp/ # Basecamp 身份(请勿读取凭据)
├── credentials.json # OAuth 令牌 — 切勿读取或记录
├── client.json # DCR 客户端注册
└── config.json # 全局首选项(account_id, base_url, format)
~/.cache/basecamp/ # 工具缓存(临时,自动管理)
├── completion.json # 标签补全缓存
└── resilience/ # 断路器状态
.basecamp/ # 每个仓库的配置(提交到 git)
└── config.json # 项目默认值(project_id, account_id, todolist_id)
每个仓库的配置: .basecamp/config.json
{
"project_id": "12345",
"todolist_id": "67890"
}
初始化:
basecamp config init
basecamp config set project_id <id>
basecamp config set todolist_id <id>
检查上下文:
cat .basecamp/config.json 2>/dev/null || echo "No project configured"
全局配置: ~/.config/basecamp/config.json(account_id, base_url, 格式首选项)
常规诊断:
basecamp doctor --json # 检查 CLI 健康状况、身份验证、连接性
速率限制(429): CLI 会自动处理退避。如果看到 429 错误,请降低请求频率。
身份验证错误:
basecamp auth status # 检查身份验证
basecamp auth login # 重新身份验证(完全访问权限)
basecamp auth login --scope read # 只读访问权限
网络错误 / localhost URL:
# 检查开发配置
cat ~/.config/basecamp/config.json
# 应仅包含:{"account_id": "<id>"}
# 如果指向 localhost,请移除 base_url/api_url
未找到错误:
basecamp auth status # 验证身份验证是否正常工作
cat ~/.config/basecamp/accounts.json # 检查可用账户
无效标志错误: 所有快捷命令都需要显式标志:
basecamp todo --content "text"(不是 basecamp todo "text")basecamp card --title "title"(不是 basecamp card "title")URL 格式错误(curl 退出码 3): 内容中包含特殊字符。使用纯文本或正确转义的 HTML。
每周安装次数
48
仓库
GitHub 星标数
2
首次出现
7 天前
安全审计
已安装于
codex40
cursor40
opencode39
gemini-cli39
github-copilot39
amp39
Full CLI coverage: 130 endpoints across todos, cards, messages, files, schedule, check-ins, timeline, recordings, templates, webhooks, subscriptions, lineup, and campfire.
MUST follow these rules:
--json for structured, predictable outputbasecamp url parse "<url>" to extract IDs.basecamp/config.json before assuming project--in <project> or .basecamp/config.json. There is no cross-project query mode. For cross-project data, use basecamp recordings <type> or loop through projects individually.basecamp <cmd> --json # JSON envelope with data, summary, breadcrumbs (recommended)
basecamp <cmd> --quiet # Raw JSON data only, no envelope
basecamp <cmd> --agent # Machine-readable, no interactive prompts
basecamp <cmd> --ids-only # Just IDs, one per line
basecamp <cmd> --count # Just the count
basecamp <cmd> --stats # Include session stats in output
basecamp <cmd> --limit 50 # Cap results (default varies by resource)
basecamp <cmd> --all # Fetch all (may be slow for large datasets)
basecamp <cmd> --page 1 # First page only, no auto-pagination
--all and --limit are mutually exclusive. --page cannot combine with either.
--assignee me resolves to current user--due tomorrow / --due +3 / --due "next week" - natural date parsing.basecamp/config.json if --in not specifiedNote: Most queries require project scope (via
--in <project>or.basecamp/config.json). For cross-project data, usebasecamp recordings <type>or loop through projects individually.
| Task | Command |
|---|---|
| List projects | basecamp projects --json |
| My todos (in project) | basecamp todos --assignee me --in <project> --json |
| All todos (cross-project) | basecamp recordings todos --json (filter client-side) |
| Overdue todos | basecamp todos --overdue --in <project> --json |
| Create todo | basecamp todo --content "Task" --in <project> --list <list> --json |
| Create todolist |
Always parse URLs before acting on them:
basecamp url parse "https://3.basecamp.com/2914079/buckets/41746046/messages/9478142982#__recording_9488783598" --json
Returns: account_id, project_id, type, recording_id, comment_id (from fragment).
URL patterns:
/buckets/27/messages/123 - Message 123 in project 27/buckets/27/messages/123#__recording_456 - Comment 456 on message 123/buckets/27/card_tables/cards/789 - Card 789/buckets/27/card_tables/columns/456 - Column 456 (for creating cards)/buckets/27/todos/101 - Todo 101/buckets/27/uploads/202 - Upload/file 202/buckets/27/documents/303 - Document 303/buckets/27/schedule_entries/404 - Schedule entry 404Replying to comments:
# Comments are flat - reply to the parent recording_id, not the comment_id
basecamp url parse "https://...messages/123#__recording_456" --json
# Returns recording_id: 123 (parent), comment_id: 456 (fragment) - comment on 123, not 456
basecamp comment --content "Reply" --on 123 --in <project>
Need to find something?
├── Know the type + project? → basecamp <type> --in <project> --json
├── Need cross-project data? → basecamp recordings <type> --json (ONLY cross-project option)
│ (types: todos, messages, documents, comments, cards, uploads)
│ Note: Defaults to active status; use --status archived for archived items
├── Full-text search? → basecamp search "query" --json
└── Have a URL? → basecamp url parse "<url>" --json
Want to change something?
├── Have URL? → basecamp url parse "<url>" → use extracted IDs
├── Have ID? → basecamp <resource> update <id> --field value
├── Change status? → basecamp recordings trash|archive|restore <id>
└── Complete todo? → basecamp done <id>
# Get commit info and comment on todo (use printf %q for safe quoting)
COMMIT=$(git rev-parse --short HEAD)
MSG=$(git log -1 --format=%s)
basecamp comment --content "Commit $COMMIT: $(printf '%s' "$MSG")" --on <todo_id> --in <project>
# Complete when done
basecamp done <todo_id>
# Create todo for PR work
basecamp todo --content "Review PR #42" --in <project> --assignee me --due tomorrow
# When merged
basecamp done <todo_id>
basecamp campfire post --content "Merged PR #42" --in <project>
# Preview overdue todos
basecamp todos sweep --overdue --dry-run --in <project>
# Complete all with comment
basecamp todos sweep --overdue --complete --comment "Cleaning up" --in <project>
# List columns to get IDs
basecamp cards columns --in <project> --json
# Move card to column
basecamp cards move <card_id> --to <column_id> --in <project>
basecamp files download <upload_id> --in <project> --out ./downloads
basecamp projects --json # List all
basecamp projects show <id> --json # Show details
basecamp projects create --name "Name" --json # Create
basecamp projects update <id> --name "New" # Update
basecamp todos --in <project> --json # List in project
basecamp todos --assignee me --in <project> # My todos
basecamp todos --overdue --in <project> # Overdue only
basecamp todos --status completed --in <project> # Completed
basecamp todos --list <todolist_id> --in <project> # In specific list
basecamp todo --content "Task" --in <project> --list <list> --assignee me --due tomorrow
basecamp done <id> [id...] # Complete (multiple OK)
basecamp reopen <id> # Uncomplete
basecamp todos position <id> --to 1 # Move to top
basecamp todos sweep --overdue --complete --comment "Done" --in <project>
Flags: --assignee (todos only - not available on cards/messages), --status (completed/pending), --overdue, --list, --due, --limit, --all
Todolists are containers for todos. Create a todolist before adding todos.
basecamp todolists --in <project> --json # List todolists
basecamp todolists show <id> --in <project> # Show details
basecamp todolists create --name "Name" --in <project> --json # Create
basecamp todolists create --name "Name" --description "Desc" --in <project>
basecamp todolists update <id> --name "New" --in <project> # Update
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.
basecamp cards --in <project> --json # All cards
basecamp cards --card-table <id> --in <project> # Cards from specific table (required if multiple)
basecamp cards --column <id> --in <project> # Cards in column
basecamp cards columns --in <project> --json # List columns (needs --card-table if multiple)
basecamp cards show <id> --in <project> # Card details
basecamp card --title "Title" --content "<p>Body</p>" --in <project> --column <id>
basecamp cards update <id> --title "New" --due tomorrow --assignee me
basecamp cards move <id> --to <column_id> # Move to column (numeric ID)
basecamp cards move <id> --to "Done" --card-table <table_id> # Move by name (needs table)
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.
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.
Card Steps (checklists):
basecamp cards steps <card_id> --in <project> # List steps
basecamp cards step create --title "Step" --card <id> --in <project>
basecamp cards step complete <step_id> --in <project>
basecamp cards step uncomplete <step_id>
Column management:
basecamp cards column show <id> --in <project>
basecamp cards column create --title "Name" --in <project>
basecamp cards column update <id> --title "New"
basecamp cards column move <id> --position 2
basecamp cards column color <id> --color blue
basecamp cards column on-hold <id> # Enable on-hold section
basecamp cards column watch <id> # Subscribe to column
basecamp messages --in <project> --json # List messages
basecamp messages show <id> --in <project> # Show message
basecamp message --subject "Title" --content "Body" --in <project>
basecamp messages update <id> --subject "New" --content "Updated"
basecamp messages pin <id> --in <project> # Pin to top
basecamp messages unpin <id> # Unpin
Flags: --draft (create as draft), --message-board <id> (if multiple boards)
basecamp comments --on <recording_id> --in <project> --json
basecamp comment --content "Text" --on <recording_id> --in <project>
basecamp comments update <id> --content "Updated" --in <project>
basecamp files --in <project> --json # List all (folders, files, docs)
basecamp files --vault <folder_id> --in <project> # List folder contents
basecamp files show <id> --in <project> # Show item (auto-detects type)
basecamp files download <id> --in <project> # Download file
basecamp files download <id> --out ./dir # Download to specific dir
basecamp files folder create --name "Folder" --in <project>
basecamp files doc create --title "Doc" --content "Body" --in <project>
basecamp files doc create --title "Draft" --draft --in <project>
basecamp files update <id> --title "New" --content "Updated"
Subcommands: folders, uploads, documents (each with pagination flags)
basecamp schedule --in <project> --json # Schedule info
basecamp schedule entries --in <project> --json # List entries
basecamp schedule show <id> --in <project> # Entry details
basecamp schedule show <id> --date 20240315 # Specific occurrence (recurring)
basecamp schedule create "Event" --starts-at "2024-03-15T09:00:00Z" --ends-at "2024-03-15T10:00:00Z" --in <project>
basecamp schedule create "Meeting" --all-day --notify --participants 1,2,3 --in <project>
basecamp schedule update <id> --summary "New title" --starts-at "..."
basecamp schedule settings --include-due --in <project> # Include todos/cards due dates
Flags: --all-day, --notify, --participants <ids>, --status (active/archived/trashed)
basecamp checkins --in <project> --json # Questionnaire info
basecamp checkins questions --in <project> # List questions
basecamp checkins question <id> --in <project> # Question details
basecamp checkins answers <question_id> --in <project> # List answers
basecamp checkins answer <id> --in <project> # Answer details
basecamp checkins question create --title "What did you work on?" --in <project>
basecamp checkins question update <id> --title "New question" --frequency every_week
basecamp checkins answer create --question <id> --content "My answer" --in <project>
basecamp checkins answer update <id> --content "Updated" --in <project>
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"
basecamp timeline --json # Account-wide activity
basecamp timeline --in <project> --json # Project activity
basecamp timeline me --json # Your activity
basecamp timeline --person <id> --json # Person's activity
basecamp timeline --watch # Live monitoring (TUI)
basecamp timeline --watch --interval 60 # Poll every 60 seconds
Note: basecamp timeline (account-wide) works reliably. The --limit flag is not supported on timeline commands.
Use basecamp recordings <type> for cross-project queries - this is the only way to query across all projects in one call.
basecamp recordings todos --json # All todos across projects
basecamp recordings todos --all --json # All todos (paginate through all)
basecamp recordings messages --in <project> # Messages in project
basecamp recordings documents --status archived # Archived docs
basecamp recordings cards --sort created_at --direction asc
basecamp recordings cards --status archived --all --json # Include archived cards
Types: todos, messages, documents, comments, cards, uploads
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).
Status management:
basecamp recordings trash <id> --in <project> # Move to trash
basecamp recordings archive <id> --in <project> # Archive
basecamp recordings restore <id> --in <project> # Restore to active
basecamp recordings visibility <id> --visible --in <project> # Show to clients
basecamp recordings visibility <id> --hidden # Hide from clients
basecamp templates --json # List templates
basecamp templates show <id> --json # Template details
basecamp templates create "Template Name" # Create empty template
basecamp templates update <id> --name "New Name"
basecamp templates delete <id> # Trash template
basecamp templates construct <id> --name "New Project" # Create project (async)
basecamp templates construction <template_id> <construction_id> # Check status
Construct returns construction_id - poll until status="completed" to get project.
basecamp webhooks --in <project> --json # List webhooks
basecamp webhooks show <id> --in <project> # Webhook details
basecamp webhooks create --url "https://..." --in <project>
basecamp webhooks create --url "https://..." --types "Todo,Comment" --in <project>
basecamp webhooks update <id> --active --in <project>
basecamp webhooks update <id> --inactive # Disable
basecamp webhooks delete <id> --in <project>
Event types: Todo, Todolist, Message, Comment, Document, Upload, Vault, Schedule::Entry, Kanban::Card, Question, Question::Answer
basecamp subscriptions <recording_id> --in <project> # Who's subscribed
basecamp subscriptions subscribe <id> --in <project> # Subscribe yourself
basecamp subscriptions unsubscribe <id> # Unsubscribe
basecamp subscriptions add <id> --people 1,2,3 # Add people
basecamp subscriptions remove <id> --people 1,2,3 # Remove people
basecamp lineup create "Milestone" "2024-03-15" # Create marker
basecamp lineup create --name "Launch" --date tomorrow
basecamp lineup update <id> --name "New Name" --date "+7"
basecamp lineup delete <id>
Note: Lineup markers are account-wide, not project-scoped.
basecamp campfire --in <project> --json # List campfires
basecamp campfire messages --in <project> --json # List messages
basecamp campfire post --content "Hello!" --in <project>
basecamp campfire line <line_id> --in <project> # Show line
basecamp campfire delete <line_id> --in <project> # Delete line
basecamp people --json # All people in account
basecamp people --in <project> --json # People on project
basecamp me --json # Current user
basecamp people show <id> --json # Person details
basecamp people add <id> --in <project> # Add to project
basecamp people remove <id> --in <project> # Remove from project
basecamp search "query" --json # Full-text search
basecamp search "query" --sort updated_at --limit 20
basecamp search metadata --json # Available search scopes
basecamp show <type> <id> --in <project> --json # Show any recording type
# Types: todo, todolist, message, comment, card, card-table, document (or omit <type> for generic lookup)
The CLI uses two directory namespaces: basecamp for your Basecamp identity and project relationships, basecamp for tool-specific operational data.
~/.config/basecamp/ # Basecamp identity (DO NOT read credentials)
├── credentials.json # OAuth tokens — NEVER read or log
├── client.json # DCR client registration
└── config.json # Global preferences (account_id, base_url, format)
~/.cache/basecamp/ # Tool cache (ephemeral, auto-managed)
├── completion.json # Tab completion cache
└── resilience/ # Circuit breaker state
.basecamp/ # Per-repo config (committed to git)
└── config.json # Project defaults (project_id, account_id, todolist_id)
Per-repo config: .basecamp/config.json
{
"project_id": "12345",
"todolist_id": "67890"
}
Initialize:
basecamp config init
basecamp config set project_id <id>
basecamp config set todolist_id <id>
Check context:
cat .basecamp/config.json 2>/dev/null || echo "No project configured"
Global config: ~/.config/basecamp/config.json (account_id, base_url, format preferences)
General diagnostics:
basecamp doctor --json # Check CLI health, auth, connectivity
Rate limiting (429): The CLI handles backoff automatically. If you see 429 errors, reduce request frequency.
Authentication errors:
basecamp auth status # Check auth
basecamp auth login # Re-authenticate (full access)
basecamp auth login --scope read # Read-only access
Network errors / localhost URLs:
# Check for dev config
cat ~/.config/basecamp/config.json
# Should only contain: {"account_id": "<id>"}
# Remove base_url/api_url if pointing to localhost
Not found errors:
basecamp auth status # Verify auth working
cat ~/.config/basecamp/accounts.json # Check available accounts
Invalid flag errors: All shortcut commands require explicit flags:
basecamp todo --content "text" (not basecamp todo "text")basecamp card --title "title" (not basecamp card "title")URL malformed (curl exit 3): Special characters in content. Use plain text or properly escaped HTML.
Weekly Installs
48
Repository
GitHub Stars
2
First Seen
7 days ago
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex40
cursor40
opencode39
gemini-cli39
github-copilot39
amp39
飞书日程待办摘要工作流:AI自动生成每日/每周开工报告,提升个人生产力
27,700 周安装
basecamp todolists create --name "Name" --in <project> --json| Complete todo | basecamp done <id> --json |
| List cards | basecamp cards --in <project> --json |
| Create card | basecamp card --title "Title" --in <project> --json |
| Move card | basecamp cards move <id> --to <column> --in <project> --json |
| Post message | basecamp message --subject "Title" --content "Body" --in <project> --json |
| Post to campfire | basecamp campfire post --content "Message" --in <project> --json |
| Add comment | basecamp comment --content "Text" --on <recording_id> --in <project> --json |
| Search | basecamp search "query" --json |
| Parse URL | basecamp url parse "<url>" --json |
| Download file | basecamp files download <id> --in <project> |
| Watch timeline | basecamp timeline --watch |