关于 basecamp
Basecamp CLI 是一项技能,为使用已安装的 Basecamp 命令行工具制定安全、先查命令的操作规则,面向处理 Basecamp 任务的 Agent,涵盖命令帮助、范围、结构化输出和错误恢复。
主要功能
- 01通过定向帮助发现命令
- 02选择明确的结构化输出模式
- 03遵循项目和账户范围
- 04处理 URL、回复和提及
- 05按安全规则恢复错误
适用场景
- 01为 Basecamp 任务确定合适命令
- 02为 Agent 工作流提取结构化结果
- 03在正确的项目上下文中发布内容
- 04根据错误提示恢复命令执行
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ basecamp/ basecamp-cli --skill basecamp安装后在 Claude Code 中输入/basecamp确认已加载。
详细介绍
Basecamp CLI
使用已安装的 CLI 作为命令参考。本技能定义操作规则;有意不重复 CLI 的命令目录。
先探索再操作的工作流
对于每项任务:
-
根据用户的描述推断最具体、最可能的叶子命令。
-
如果本次对话中的工具结果尚未明确该命令的确切参数或标志,请直接检查该叶子命令:
basecamp <group> <subcommand> --agent --help -
如果叶子命令不存在,请检查最接近的父级命令组。只有在顶级命令组本身不明确时,才使用根帮助:
basecamp <group> --agent --help # fallback basecamp --agent --help # last resort -
将叶子命令的
usage、args、flags和notes视为事实依据。不要猜测位置参数、标志、别名、作用域,或某个命令组是否可以直接运行。 -
使用明确的输出模式执行命令,然后先读取结构化错误和操作线索,再决定下一步。
针对叶子命令的帮助信息成本低且范围有限;根帮助会返回完整命令目录,消耗的 token 也更多。不要只为确认本技能已记录的全局标志而加载根帮助。对于显而易见的 Docs & Files 请求,应直接使用 files list、files download 或 files uploads create,不要先尝试父级命令或根帮助。子命令的 inherited_flags 有意保持简短;全局标志(例如 --agent、--jq、--profile 和 --verbose)在受支持的情况下仍然适用。
不容违背的规则
- 绝不读取、打印或记录 OAuth 令牌或凭据文件。尤其不要打开
~/.config/basecamp/credentials.json。 - 绝不将 JSON 通过管道传给外部
jq。请使用 CLI 内置的--jq。 - 使用 Basecamp URL 中的 ID 前,先解析 URL:
basecamp url parse "<url>" --json。只信任来自已知 Basecamp 主机的 URL。叶子命令帮助明确接受<id|url>的只读命令,可以直接使用可信 URL。 - 评论采用扁平结构。回复会发布到父级记录,而不是评论 ID。如果需要上下文,请对评论 URL 使用
comments show或comments thread来获取reply_target。 - 尊重项目上下文。假定项目之前,先运行
basecamp config show --json:其project_id是综合标志、环境变量和所有配置层后生效的值,并会注明来源。不要直接读取.basecamp/config.json;它只是其中一个配置层。如果没有project_id,请传入--in <project>,或使用叶子命令帮助所示的作用域。 - 对 Agent 工作使用非交互式输出。不要让含糊不清的选择器阻塞执行。
- 如果结果报告包含内容附件或描述附件,请下载并检查。图片通常包含任务的关键信息。
- 移动到其他容器后,输出会显示该项目的新 ID;之后请使用新 ID,因为旧 ID 将无法再接受写入操作。复制操作会输出副本的 ID,并保留原件不变。绝不要重复复制:Basecamp 会在后台处理文件,因此仍在运行或未返回结果的副本可能已经存在。请使用
basecamp filings show <id>命令或输出的提示检查副本,绝不要再次复制。 - 优先遵循已安装命令的帮助信息,而非对早期 CLI 版本的记忆。
输出模式
请根据需要谨慎选择:
| 目标 | 模式 |
|---|---|
| 提取、计数或转换数据 | --jq '<expression>' |
| 使用完整的结构化响应 | --json |
| 不带封装地使用数据 | --agent |
| 直接向用户呈现可移植的输出 | --md |
--jq 会启用 JSON。它通常会筛选 JSON 封装,因此数据通常位于 .data 下。与 --agent --jq 搭配使用时,它会筛选仅含数据的载荷。面向用户的列表请使用 --md,但请注意,仅使用 --md 并不会禁止交互式提示。请提供足够的作用域以消除歧义,或设置 BASECAMP_NONINTERACTIVE=1。
以下是通用转换示例,并非用于探索命令:
basecamp <leaf-command> --jq '.data | length'
basecamp <leaf-command> --jq '[.data[] | {id, name}]'
项目、账户和分页范围
不要根据命令中的名词推断它是针对项目还是整个账户。 请查看叶子帮助和其中的说明。如果用户明确提供了项目或账户,则使用该项目或账户;否则遵循可信的本地配置。
对于分页命令,在组合分页标志前先查看帮助。通常,--limit N 会限制自动分页结果的数量,--all 会遍历所有页面,而 --page N 会请求单个页面;但各个端点可能有所不同,互斥的组合会被拒绝。
命名身份使用配置档案。使用全局 --profile <name> 或 BASECAMP_PROFILE=<name> 选择一个配置档案;不要悄悄切换配置档案或默认账户。
URL 和回复
解析后的 URL 可提供 account_id、project_id、recording_id,如果片段指向评论,还可提供 comment_id。
basecamp url parse "https://3.basecamp.com/123/buckets/456/todos/789" --json
回复时,先获取可用于回复的上下文,而不是向片段 ID 发布内容:
basecamp comments thread "<comment-url>" --json
# Post to .data.reply_target.recording_id
只需获取便于回复的目标和提及标记时,使用 comments show;需要查看周围讨论时,使用 comments thread。
Pings
Ping 是账户内人员之间的私人对话,不属于任何项目:两人之间是直接对话,多人则是群组对话。它不是项目聊天,因此 chat list --all 永远不会显示它。请使用 pings 命令组。
basecamp pings list --agent # your pings
basecamp pings start "Jane Smith" --agent # open your ping with Jane, or start it
basecamp pings post "Jane Smith" "Lunch?" --agent
basecamp pings messages "Jane Smith" --agent
<ping>可以是 ping ID、ping URL(/circles/<id>或/circles/<id>@<line>),也可以是人员。纯数字始终表示 ping ID,绝不表示人员 ID。- Ping 有消息后,
pings list才会显示它。刚发起的 ping 尚未列出;pings start会显示它。 pings start会复用已有内容:每人对应一个直接 ping,每组人员对应一个群组 ping,除非使用--new-group。可用它查找已有的 ping。pings messages和针对某人的pings show会读取已有的直接 ping,绝不会发起新的 ping;如果尚无 ping,pings post和pings upload会发起一个。pings post中的 @提及会在该 ping 的参与者中解析。- 消息 URL(
/circles/<id>@<line>)可与basecamp show和chat line搭配使用;要编辑或删除此类消息,请对该 URL 使用chat update或chat delete。 - 通用记录命令不会更改 ping 中的任何内容:
recordings trash、archive、restore和visibility,subscriptions add和remove,以及spotlight都会被拒绝(退出码 4)。在此处只能通过subscriptions subscribe或subscriptions unsubscribe更改自己的订阅。
Spotlight
Spotlight 会将记录卡片放入项目主页的 Spotlights 区域。它不是置顶:messages pin 只会将消息固定在消息板顶部。spotlight 是顶级命令,不属于任何记录类型的命令组;它接受消息、文档、文件、待办事项列表、待办事项、卡片、卡片列、签到问题、日程条目等的 ID 或 URL。unspotlight 会移除它,效果与在 Basecamp 中使用“Remove Spotlight”相同。
basecamp spotlight <id|url> --agent
basecamp unspotlight <id|url> --agent
项目壁纸
壁纸是显示在项目页面背景中的图片。projects wallpaper 命令组可为 --in/--project 指定的项目或配置的默认项目设置、调整布局和移除壁纸:
basecamp projects wallpaper set skyline.jpg --mode tile --in "<project>" --json
basecamp projects wallpaper mode fill --in "<project>" --json
basecamp projects wallpaper remove --in "<project>" --json
- 人员和个人助手遵循项目编辑权限。共享 Agent 会被拒绝(403);不要重试,也不要绕过此限制。
- CLI 会在上传前检查文件大小和 MIME 提示;限制详见叶子帮助。服务器仍会执行图片验证。
--mode可设为fill或tile;不指定时会保留当前模式。 - 每条命令都会返回项目。
.data.wallpaper的格式为{url, mode};项目没有壁纸时该字段不存在。projects show也包含同一字段。此 URL 需要身份验证,并会重定向到图片;它不是公开图片链接。
项目徽标
徽标是显示在项目名称旁边的图片,与项目壁纸分开。projects logo 命令组可为 --in/--project 指定的项目或已配置的默认项目设置或移除徽标:
basecamp projects logo set brand.png --in "<project>" --json
basecamp projects logo remove --in "<project>" --json
- 可以编辑项目的人员和 Agent 可以更改其徽标。其他人会收到 403,而调用者无法查看的项目会返回 404;不要重试或绕过这两种拒绝。
- CLI 会在上传前检查文件大小和 MIME 提示;具体限制请查看末级帮助。服务器端仍会执行图片验证。移除没有徽标的项目的徽标也会成功。
- 每个命令都会返回项目。
.data.logo的值为{url};项目没有徽标时,该字段不存在。projects show也会包含相同字段。此 URL 需要身份验证,并会重定向到图片;它不是公开图片链接。
内容与 stdin
命令帮助会说明内容参数和是否支持 stdin。标题通常为纯文本;富文本字段通常接受 Markdown,并可在文档说明的情况下使用 --format html 选择 HTML。若帮助显示的是位置参数,请勿臆测存在 --title、--body 或 --content 标志。
对于多行、非 ASCII 或对 Shell 敏感的内容,请在文档指定的内容位置传入 -,并通过管道提供 stdin:
printf '%s\n' 'First line' '' 'Second line' |
basecamp <leaf-command> <other-args> - --json
管道内容绝不会被隐式读取。一次调用中只能有一个输入读取 stdin。请勿在可移植命令中使用 $'line 1\nline 2' 这类特定于 Shell 的 ANSI-C 引号。
富文本字段支持 Mermaid 图表。将源码放入语言标记为 mermaid 的围栏代码块中,Basecamp 就会向阅读帖子的人员显示图表。预览、邮件和导出内容会显示源码;源码无法解析的帖子也会显示源码。对于用图比文字更容易理解的流程、时序、时间线或结构,请使用图表。图表源码会跨越多行,因此请通过 stdin 传入:
basecamp messages create "Release flow" - --in "<project>" --json <<'EOF'
How a release reaches production:
```mermaid
flowchart LR
Merge --> CI --> Staging --> Production
```
EOF
要嵌入视频、Dash 图表或其他 Basecamp 编辑器在粘贴链接时会嵌入的内容,请在 Markdown 内容中单独一行放置 URL。CLI 会向 Basecamp 请求嵌入内容并等待结果。Basecamp 无法嵌入的 URL 会保留为链接;句子、列表、引用或代码中的 URL 也一样。若要保留指向 Basecamp 可嵌入内容的链接,请写成 [title](url)。
basecamp cards create "Checkout latency" - --in "<project>" --json <<'EOF'
p99 since the deploy:
https://dash.37signals.com/widgets/abc
EOF
使用 --format html 时,系统不会自动为你嵌入内容:请运行 basecamp embeds create <url> --json,并将其 attachment 标签放入 HTML 中。
为确保提及结果一致,建议使用人员或评论结果中机器提供的提及语法,例如 [@Name](mention:SGID)。不同字段对提及功能的支持有所不同;请以末级帮助为准。
错误与恢复
结构化故障包含 error、code、retryable,通常还包含 hint。
- 仅当
retryable为 true 时才重试,并使用有限次数的退避策略。 retryable: false表示没有明确的重试信号;已知判定结果和未分类故障都属于此情况。选择恢复方式前,请检查code、error和hint,不要盲目重复相同的调用。- 对于用法错误,请查看叶级帮助,并提供其中指定的位置参数。
- 如果 CLI 将命令或标志判定为未知,请先查看该命令组的帮助,确认当前用法。如果此技能中提到了该命令或标志,但帮助中没有,CLI 与此技能可能来自不同版本:
basecamp doctor --json会报告两者的版本。请向用户指出较旧的一方:如果较旧的是 CLI,请运行basecamp upgrade;如果较旧的是插件,请更新插件。 - 对于名称含糊不清的情况,请使用 ID,或补充缺失的项目/容器范围。
- 诊断身份验证或连接问题时,请先使用
basecamp doctor --json和basecamp auth status --json,再更改凭据。 - 进行任何登录恢复之前,请检查
oauth_type。agent配置必须通过 CLI 提示中指定的 Agent/客户端凭据流程恢复;普通用户登录可能会替换 Agent 身份。
不要仅仅因为命令失败就擅自调用原始 API。请先查看相关帮助和错误提示。仅当 CLI 没有原生操作,且 API 路径和载荷已知时,才使用 basecamp api。
变更
更改 Basecamp 之前:
- 明确且无歧义地确定账户、项目、容器和条目。
- 查看叶级帮助,确认必需的位置参数以及可见性或通知行为。
- 仅进行用户要求的最小更改。
- 返回生成的 ID/URL,并概述所做的更改。
对于破坏性操作或范围较广的操作,如果命令提供试运行,请先预览;不要扩大用户要求的范围。