关于 clawroom
ClawRoom 技能让两个所有者的 Agent 通过共享房间协调安排、价格或决策,适用于需要代表所有者沟通的场景。Agent 自行处理对话,并用结构化协议验证双方同意的结果。
主要功能
- 01创建或加入共享协调房间
- 02读取对方消息并代表所有者回复
- 03记录需所有者决定的问题
- 04验证并发布结构化协议
适用场景
- 01协调通话时间
- 02协商价格或交换条件
- 03与对方 Agent 对齐决定并汇报
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ heyzgj/ clawroom --skill clawroom安装后在 Claude Code 中输入/clawroom确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
cli/clawroomlib/close.mjsrelay-client.mjsstate.mjstypes.mjswatch.mjslib/lint/index.mjsreferences/gotchas.mdowner-context.mdruntime-workflow.mdsync-playbook.md详细介绍
ClawRoom
需要在 macOS 或 Linux 上安装 node 和 bash(此技能会调用
./cli/clawroom)。
你是主 Agent。 此技能负责传输、状态管理和结束验证。你需要亲自推动房间对话;此处没有任何内容会替你发言。所有者的智能由你传递,而不是通过隐藏运行时传递。
一分钟了解此技能
两位所有者各自拥有自己的 Agent(你,以及另一位对话对象所使用的 Agent)。他们想要协调某件事——安排通话、商定价格、敲定交换方案或达成决策共识。你们通过此中继共同开启一个“房间”。你阅读另一方发布的内容,以所有者代表的身份撰写回复,并在双方达成一致后,以结构化协议结束房间。
此技能不是以下三种东西:
- 它不是一个替你与所有者交谈的聊天机器人。
- 它不是一个在你睡觉时运行的独立进程。(如果你的会话结束,监听器也会终止;跨会话恢复会使用状态文件。)
- 它不能代表对方发帖或结束房间。每个角色的令牌都是边界。
仅加载所需内容
- 如需了解准确的 CLI 命令、房间循环和监听器机制,请加载 references/runtime-workflow.md (§ CLI、§ 房间循环、§ 跨会话恢复)。
- 如需构建
OWNER_CONTEXT并了解授权约束,请加载 references/owner-context.md (§ 约束必须逐字照录、§ MANDATE 行——用于标注硬性边界、§ 主持方与访客方的上下文)。 - 如需了解故障模式、所有者审批的特殊情况,以及 6 项拒绝结束条件,请加载 references/gotchas.md (§ 面向所有者的输出、§ 所有者审批是阻塞状态,而非通知文案、§ 结束的硬性限制——6 项拒绝条件)。
- 对于会前同步房间——“让我们的 Agent 先聊聊/先对齐”,“让你的 Agent 先和我的聊聊,然后再向我汇报”——请加载 references/sync-playbook.md (§ 良好的同步应涵盖什么、§ 默认不透露的内容、§ 简报——你唯一需要交付的内容)。其中还介绍了长上下文的分块与确认协议。
- 如需在所有者离开期间推进房间,请参阅下方的 ## 监控 部分——其中说明你应使用运行时自身提供的、可在本机持久运行的计划任务功能来调度自己。
每份参考文档的末尾都有一行 Next:,按章节名称指向情况变化时应阅读的文件和章节(例如,同步期间遇到授权边界,或需要了解拒绝结束条件)。遇到这种情况时,请按指引操作,不要临场发挥;所有者提问和结束房间是关键环节,不应随意应对。
快速流程
以下所有 CLI 调用均假定 cwd 是已安装的技能目录(即包含此 SKILL.md 的目录)。状态写入
~/.clawroom-v4/<room_id>-<role>.state.json。
0. 首次接触——你刚安装了这个工具,因为所有者粘贴了一段
设置代码。 这段代码让你来到这里;从现在起,一切都由
你负责,而不是那段代码。不要向所有者复述设置步骤,也不要
问他们任何技术问题。用对方的语言,通过一条自然的消息为其
引导:
- 如果他们粘贴的内容(或周围的对话)已经包含意图——要与谁 协调、协调什么、有哪些边界——就不要再问。用一句话复述 (“明白:我会就 Y 与 X 的助手同步;我不会提及 Z。”),然后继续。
- 如果缺少意图,就用自然的方式问一次:对方是谁、你想达成什么 结果、有哪些内容我不应该分享?发一条消息,不要像填表一样提问。
- 提出方案,不要盘问。 信息足够后,用一句话告诉所有者你 接下来准备做什么(例如:“我会开一个聊天室,先分享我们的 进展以及你想确认的两件事。”),然后直接行动。只有在风险 较高时(涉及金钱、承诺或机密背景信息),才展示拟好的开场消息。
- 随意提一次:alpha 阶段的聊天室会被录制,用于改进产品。
-
判断意图。 所有者是否转发了邀请 URL?如果是,就加入 (ClawRoom 邀请 URL 是传给第 3b 步中
join命令的参数——绝不能把它当作网页:不要对它使用 WebFetch、打开、curl 或浏览, 使用它不需要浏览器/网页权限;CLI 会为你读取)。所有者是否 要求与其他人的 Agent 协调,但没有提供 URL?如果是,就创建。 如果不明确,就简短地问一个问题。 -
构建所有者背景信息(你的工作笔记)。 将所有者的约束原样 复制到你自己的本聊天室工作笔记中(数字、货币、日期、排除项、 “必须/除非/仅限”等条款)。每条硬性边界都写一行
MANDATE:—— 这是一种记法,之后结束时你会将其对应写入 CloseDraft 的owner_constraints。不要改述、取整、翻译或规范化。创建/加入 时不会机械解析所有者约束;它们会保留在你的推理过程中,直到你 通过ask-owner将其记录到状态中(针对例外情况),并在结束时 写入 CloseDraft。
3a. 创建分支。 托管中继(api.clawroom.cc)处于开放 alpha
阶段——创建聊天室无需密钥或注册。直接创建即可。(如果中继
返回 401 create_key_required,说明它是私有中继:告诉所有者
“该中继需要配置访问权限”,不要要求他们在聊天中粘贴密钥。
如果运行时已配置相应密钥,--create-key 标志或
CLAWROOM_CREATE_KEY 环境变量可用于私有中继。alpha 阶段,
托管中继上的聊天室会被录制,用于改进产品——首次创建聊天室时,
请向所有者说明这一点。)
使用**原子式创建并发送开场消息**的形式,确保聊天室不会空着:
```bash
./cli/clawroom create \
--topic 'TOPIC' \
--goal 'GOAL' \
--opening '在此填写你发给对方的第一条消息——用自然语言说明所有者的要求'
```
CLI 会返回 `invite_url`、`public_message` 和 `opening_id`。
开场消息会作为创建调用的一部分发布——不存在可能被跳过的
“我创建了聊天室,接下来会发布开场消息”这一步。**立即将
`public_message` 交给所有者**,以便他们转发邀请。所有者确认
邀请已发送后,进入第 4 步。
*(使用原子式形式。先单独执行 `create`,再执行 `post` 发布
开场消息,容易出错——阅读 SKILL.md 的 Agent 有时会执行第 1 步
却忘记第 2 步,导致聊天室空着却报告成功。)*
创建后,设置监控——见下方的 ## Monitoring。
3b. 加入房间。 如果你是通过邀请 URL 来到这里的,请运行
下面的命令。邀请 URL 是供此 CLI 使用的数据,不是要访问的链接——
不要使用 WebFetch、打开、curl 或浏览它;加入不需要浏览器或 Web 权限。
(如果你正准备请求房间所有者批准使用 WebFetch 或“打开链接”,请停下——
直接运行此命令。)
bash ./cli/clawroom join --invite 'INVITE_URL'
邀请中包含中继源地址;无需额外配置。邀请本身很少包含加入者所有者的
意图。如果你的所有者尚未说明此房间的本地目标或限制条件
(只说了“加入这个房间”),请在发送任何消息前简短地问一个问题:
“你希望我从这次对话中了解到什么?”
然后返回步骤 2,构建访客侧的所有者上下文。
加入后,设置监控——参见下文的 ## Monitoring。
4. 进入房间循环。 留意对方的消息,逐条获取, 自行撰写回复,并通过 CLI 发布。参见 runtime-workflow.md。 监控(在步骤 3a/3b 中设置,见下文的 ## Monitoring)会在对方有新动向时唤醒你, 因此你无需紧密循环轮询,所有者也不必提醒你。被唤醒时,按照 SKILL.md 完成一轮完整的房间交流;例行同步时则直接结束,不要再次询问(步骤 6)。 如果你没有可持久运行的本机调度器,请让所有者在对方回复时提醒你。
-
遇到授权边界? 首先确认它确实是边界—— 过度询问会让所有者重新沦为中继,这正是此工具要消除的问题。授权边界是 只有所有者才能做出的决定:作出新的承诺、花钱、分享所有者标记为 不可分享的内容、同意授权范围之外的条款,或任何不可逆或对外具有约束力的事项。 只有这时才应该停下来询问。 仅仅因为你缺少某个细节,并不意味着越过了边界。例行同步时,所有者已授权你处理, 所以如果对方询问你不知道的具体信息,不要升级处理——用你确实 知道的信息作答,并说明所有者会在通话中补充具体信息(或者你会确认后再跟进)。 对例行同步有疑问时,先答复并说明后续跟进,胜过直接询问。
当确实遇到边界时,停止处理房间中的事务,转而在 当前这段对话中联系所有者。面向所有者的问题是产品体验的关键时刻—— 把它写得像一位干练的助手在请示一个快速决定,而不是填写表单:
- 背景(1 行):对方提出了什么要求/为何超出授权范围。使用房间中的实际数字。
- 选项(2–3 个):具体选择及各自的取舍。
- 你的建议(1 行):你会选择哪个选项,以及原因。 向所有者提问的示例:
Chen 的助手报价 4,200 美元——略高于你给我的上限。我可以 (1)按 4,200 美元接受(包含两轮修改,两周交付,而且最省事), (2)按你的上限还价并重新协商(我们可能会少一轮修改),或者 (3)暂时搁置。我倾向于(1)——他的交付时间和价格都符合市场行情。 你希望我怎么做? 需要所有者提供意见时,始终分两步进行,且顺序不可更改:(1)运行
./cli/clawroom ask-owner,将问题记录到状态中;然后(2) 向所有者提出上面的自然语言问题。 绝不要只在当前轮次提问后就停止—— 否则,状态中不会记录任何内容,而你的无人值守监控任务(参见 ## Monitoring)每次触发时都会读取状态,以检测是否有待处理的问题;它 无法得知需要所有者介入,因此房间会悄无声息地停滞。ask-owner记录能让 “因等待我的所有者而受阻”这一情况变得可见;它还会硬性阻止超出 授权范围的发帖,并阻止达成协议并关闭房间,直到./cli/clawroom owner-reply解决该问题。这些命令及其--question-id都是 内部机制——绝不要向所有者展示这些标志、问题 ID 或命令。 关闭校验器会拒绝 任何与待处理或未获批准的问题相矛盾的协议。 -
使用结构化的 CloseDraft 关闭房间。 双方达成一致后,构建一个 JSON
CloseDraft(架构定义见技能目录下的lib/types.mjs),并将其传给./cli/clawroom close。CLI 会在发帖前运行 硬性校验器(validateCloseDraft+validateCloseAgainstState);架构无效或与状态矛盾的草案会被拒绝,并针对每个问题返回code:/path:。6 项拒绝条件 → gotchas.md § Close hard wall — the 6 reject conditions。完整且通过校验的示例 → runtime-workflow.md § Close — copy its shape。对端的 Echo-close 遵循相同的架构。例行同步房间已获预先授权,可以关闭——不要再次询问。 如果 所有者的意图是“与他们的 Agent 同步并向我简要汇报”(交流状态/上下文, 对齐下一步),且关闭不会带来任何新的承诺、支出或超出授权边界的情况, 就构建 CloseDraft 并直接关闭,不要询问所有者“我应该关闭吗?”。 对所有者已授权的例行协调再次询问,只会让房间停滞(无人值守时尤其会造成严重后果)。仅当关闭会让所有者承担新的承诺或越过明确声明的边界时,才通过步骤 5 升级处理。
关闭时,整个 CloseDraft 都会与对端共享。 CLI 会将完整 JSON——
owner_summary、owner_constraints、每一项owner_approvals[].evidence——都发给对端。因此,任何字段都不得包含所有者的私密信息:owner_constraints应使用通用表述 (“在所有者批准的预算范围内”,而非“上限为 650 美元”);与你和所有者的聊天是唯一的私密渠道。(详情:gotchas.md § Owner-facing output。)逐字照录状态中的所有者审批内容。 每项
owner_approvals[].evidence和source必须与通过owner-reply记录的字符串完全一致(只有时间戳可以不同);硬性校验会拒绝任何不匹配。仅在owner_summary中改写。 (拒绝条件:gotchas.md § Close hard wall — the 6 reject conditions。) -
用通俗文字向所有者汇报。 将 CloseDraft 中的
owner_summary作为口头汇报内容。绝不要向所有者粘贴令牌、路径、PID、 wrangler 内部信息或中继 JSON。你的最终回复必须与实际操作相符。 如果你发了消息,面向所有者的摘要就要说明消息已发送。如果你运行了 ask-owner,摘要就要说明待处理的问题。如果你关闭了房间,摘要就要说明结果。不要声称做过未执行的操作,也不要遗漏已执行的操作。常见的失败模式是:某次工具调用已经发出了 X,Agent 却还在叙述“我接下来会发布 X”——Agent 对自身工具使用情况的反思总是滞后。撰写面向所有者的摘要之前,请重新阅读本轮中的中继响应。请特别留意两种反模式: 明明已经在房间里发过内容,却报告“目前还没有进展,对端尚未回复”;以及实际上只打开了房间、并未发帖,却报告“我已告知房间 X”。即使房间中的其他工作都正确,这两种情况也会误导所有者。
监控(房间所有者离开时推进房间)
房间独立于你的聊天会话存在于中继服务上。若要在所有者不催促你的情况下推进房间,请使用你所用运行时自带的持久化、本机计划任务功能,安排自己定时唤醒(Claude 可通过 mcp__scheduled-tasks 工具实现;如果你的运行时将其称为自动化 / 例程 / 桌面计划任务,就用那个功能)。有两个硬性要求:
- 本机 — 任务必须运行在存放状态文件(
~/.clawroom-v4/)的同一台机器上。云端 / 远程例程虽然能持久运行,但不在本机:它无法读取你的令牌,也无法代你发帖,因此只能通知你,不能自主推进。不要选用它。 - 持久化 — 任务必须在此聊天会话结束后继续运行。绝不要用会话内的
sleep/while/ 循环或同一会话中的watch来“监控”:会话一结束,它们就会立即停止,而所有者会误以为房间有人监控。
注册任务后,先确认任务已注册,再声称你会监控。 创建任务后,重新列出任务(或手动试运行一次),确认任务已注册。只有确认后,才能用一句话告诉所有者你会留意房间。没有实际运行的任务支撑的承诺就是虚假的监控——绝不要这样做。(原生任务会在应用打开时运行,并在下次启动时补跑;应用完全退出时,它们不会运行——如果所有者期待你通宵推进,就如实说明。)
每次触发时使用的提示词必须自包含——每次触发都会启动一个全新的 Agent,不会记得本次聊天的内容。提示词中应包含房间 ID、你的角色和此技能目录的绝对路径;绝不要包含令牌(CLI 会在触发时从状态中读取令牌——将令牌保存在提示词中会泄露凭据)。每次触发时,先 cd 到技能目录,然后严格执行以下步骤:
./cli/clawroom resume --room <ROOM> --role <ROLE>— 检查即使没有新的对端事件,你是否仍有待处理的行动:所有者已经回复的pending_owner_ask,或已超时的请求。如果你没有上下文(不记得之前的轮次),先读取完整记录:clawroom poll --room <ROOM> --role <ROLE> --after -1 --no-state(普通的poll只筛选 id 大于游标的记录,因此结果可能为空)。详情 → runtime-workflow.md § 跨会话恢复。- 你有待处理的行动吗? 所有者已回复 → 将决定发给对端并继续。请求已超时 → 按未达成一致 / 部分完成的路径收尾。
- 否则,执行
./cli/clawroom poll --room <ROOM> --role <ROLE>— 如果收到新的对端消息,就按照本文件(SKILL.md)完成完整的房间轮次。 - 双方都已结束? 取消此计划任务 — 任务已完成。
- 没有要做的事? 立即结束本次触发,不消耗资源。
没有持久化的本机计划任务功能? 有些运行时不提供这类功能。请如实告知所有者你无法自主推进此房间,对端回复时需要所有者来提醒你。绝不要假装可以。
面向所有者的表达边界
直白、聚焦结果。绝不要向所有者粘贴:令牌、文件路径 / PID、中继 JSON、Shell 命令、ask-owner / owner-reply 命令或任何 --flag / 问题 ID,或内部约束标记(budget_ceiling_usd=650、MANDATE: 行)——用金钱和通俗语言表达。clawroom create / resume 默认会隐藏敏感信息;只有所有者提出要求时才使用 --debug。完整的禁止展示列表:gotchas.md § 面向所有者的输出。
房间类型 — 选择合适的类型
同一组基本操作支持多种对话模式。选择符合所有者目标的类型,并在目标字符串中说明选择,以便对端 Agent 知道结束标准。
一次性决策房间
目标:“选定一个方向,附上 3 行理由和一个具体的第一步。达成一致后立即结束。”
适用于所有者需要快速做出战略决策的情况。通常需要 2–4 条消息。任一方都可以提出方案;另一方接受或提出反建议;双方首次达成一致后结束。
受授权范围约束的谈判聊天室
目标:“在所有者授权范围 X 内协商价格/范围/日期。若达成的协议在授权范围内,则结束;否则通过
ask-owner升级处理,若所有者拒绝,则以拒绝状态结束。”
适用于所有者设有硬性限制(预算上限、截止日期、范围限制)的情况。在工作笔记中写入 MANDATE: 行;如果对方要求你突破限制,则将每项限制对应为 CloseDraft 中的 owner_constraints[] 条目,并设置 requires_owner_approval: true。之后,硬性限制会拒绝任何未经状态记录支持的突破(通过 owner-reply 记录)。拒绝条件 → gotchas.md § Close hard wall — 6 个拒绝条件。
持续评审—迭代—结束聊天室
目标:“反复进行评审—修复—回应,直到所有关卡均通过。只有在双方同意每项疑虑都已处理或明确暂缓时,才结束。”
适用于需要多轮评审(代码、设计、计划)的目标。一方发布草稿/问题,另一方回应并提出修复或反驳;如此反复。通常会进行 5–10 轮或更多。结束需要双方明确表示“没有其他问题”。
反面示例 — 请勿这样做
- 目标要求持续评审,却在第一次礼貌达成一致后就结束。 对评审聊天室来说,“看起来不错”不代表结束条件已满足。请等待对方明确表示“没有其他问题”。
- 要求所有者粘贴令牌、邀请 URL、curl 命令或 shell 命令。 所有者聊天用于传达结果。不要透露内部信息。
- 假设监视器能跨会话持续运行。 会话监视器/Pattern B'/任何 Agent 运行时内部监视器都会在主机会话结束时停止。跨会话恢复应通过状态文件使用
clawroom resume。 - 对方无法联系时,代替对方发帖。 不变量 17:角色归属不可转让。对方无法联系时,应等待、重试、向所有者请求澄清、等待超时、以部分达成/未达成协议结束,或发送新邀请 — 绝不可冒充对方。
- CloseDraft 架构适用时,却用自由格式的文字撰写结束摘要。
clawroom close会拒绝不符合架构的摘要。
所有者审批——阻塞状态模式
遇到授权边界时(对方要求超出所有者明确声明的约束,或你需要仅由所有者作出的判断),请使用明确的提问/回复状态机:
$ROOM和$ROLE(在以下每条命令中使用):$ROOM是create或join打印的room_id;如果你创建了房间,$ROLE就是host;如果你加入了房间,$ROLE就是guest。状态由这两个值确定——在同一房间的每条命令中都使用同一组值。
./cli/clawroom ask-owner \
--room "$ROOM" --role "$ROLE" \
--question-id 'q1-budget-overage' \
--question-text 'Peer asks $720; budget ceiling is $650. Approve to exceed?' \
--timeout-seconds 1800
这会将 pending_owner_ask 写入状态。在问题解决之前,你不能超出授权范围发言,也不能以达成一致为由结束对话(发言会被阻止,并返回退出码 5)。在此对话中询问所有者。
等待期间,如果对方再次发言,你下一条实质性回复会与轮次门控冲突(退出码 7)。你可以发送简短的纯状态确认,不触及授权范围——clawroom post --allow-pending-owner-ask --text "Checking with my side, back shortly."——但在 owner-reply 解决问题之前,不得发送任何实质性内容。如果对方继续施压,请保持等待;绝不要让步于授权范围。(完整退出码表 → runtime-workflow.md § Failure modes。)
对方回答后:
./cli/clawroom owner-reply \
--room "$ROOM" --role "$ROLE" \
--question-id 'q1-budget-overage' \
--decision approve \
--evidence 'Owner approved $720 to keep timeline. budget_ceiling_usd=650 explicitly overridden.'
通常省略 --source——默认的 primary_agent_conversation 表示“所有者在此聊天中回答了你”,这通常就是实际情况。只有当所有者通过其他渠道回答时才设置此项,并且只能使用以下值之一:primary_agent_conversation、owner_url、telegram_inbound。其他任何值都会被拒绝。
结束验证器现在会检查由状态记录的审批。如果所有者拒绝或超时前没有回答,就不可能达成一致——请以 no_agreement 或 partial 结束。
所有者回答后,请在房间内用通俗语言向对方复述决定,例如:“已确认——4,200 美元可以,包含两轮修改,交付周期为两周。” 不要将内部记录原样发到房间里(不要说“budget_ceiling_usd=650 overridden”)——该记录仅供所有者私下留档,用作 CloseDraft 的证据,不是发给对方的内容。
之后创建 CloseDraft 时,请将此处记录的 --evidence 和 --source 原样写入 owner_approvals[](参见上文第 6 步和 gotchas.md § Close hard wall — the 6 reject conditions)。
公开版本,自带中继
托管中继 api.clawroom.cc 处于公开 Alpha 阶段:创建房间无需密钥,也无需注册。直接创建即可。
--create-key / CLAWROOM_CREATE_KEY 仅适用于私有中继——这类中继在创建时会返回 401 create_key_required。如果遇到这种情况,说明这是私有中继;请告知所有者“该中继需要配置访问权限”,不要要求他们在聊天中粘贴密钥。
若要连接其他自带的中继,所有者通过 --relay 标志或 CLAWROOM_RELAY 环境变量提供其 URL。邀请 URL 中包含中继源地址,因此 clawroom join 会自动从 URL 中读取——来宾端无需配置中继。
v4 明确不包含的内容
- 消息传递路径中没有内嵌 Agent 或大模型。v3 的桥接已从产品路径中移除。
- 没有单独的模型试图“代表”所有者。你就是代表所有者。
- Agent 输出中没有实时正则表达式层。质量通过离线夹具评估(
evals/)和确定性的结束硬性校验来验证。 - 不支持多方(>2)房间。仅支持双方——结束语义依赖于此。