Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Git

通过 git forge 的 issue 和 pull request 评论与代理对话,并通过按事件路由表展示仓库事件,包括 PR 生命周期、审查评论、CI 结果和发布。该通道围绕一个 provider seam 构建:provider 字段用于选择 forge。GitHub、Gitea 和 Forgejo 是已接入的 provider;其他 forge 作为并列 provider 接入,无需更改通用通道。

刚接触 ZeroClaw? 先从 Quickstart 开始,获取一个正在运行的代理,然后快速浏览 Concepts,了解本页默认使用的术语(agent、peer group、autonomy、SOP)。

使用 GitHub 提供方时,ZeroClaw 会以 GitHub App 身份进行认证,并以该应用自己的机器人身份(your-app[bot])回复,因此它可在安装了该应用的任何仓库中工作。没有个人访问令牌,也没有共享用户账户。

使用 Gitea/Forgejo 提供程序时,ZeroClaw 会使用个人访问令牌针对实例的 Gitea 兼容 API 进行身份验证,并以该令牌的所有者身份进行回复。

**构建说明:**标准分发制品中包含 Git 通道,但精简的 Cargo 默认配置中不包含。自定义源码构建必须添加 channel-git;禁用默认功能的构建还必须添加 agent-runtimechannel-git 功能会引入所有已接入的 forge 提供商,因此单个二进制文件即可服务所有受支持的 forge;不存在可供选择的更小的按提供商划分的构建子集。

谁可以与代理通信

入站发送方会根据为绑定代理解析出的对等集合进行限制,该集合来自代理所属的 peer_groups 配置。匹配时会去除开头的 @,并对通道的原生发送方标识符执行不区分大小写的比对。集合会拒绝所有人;包含 "*" 的集合会接受所有人;否则仅接受列出的外部对等方(以及对等代理)。这与网关配对(gateway.require_pairing)不同,后者验证的是 HTTP/WebSocket 客户端,而非聊天通道的发送方。

git 的 peer group 将 channel 设置为 git,在 external_peers 中列出允许的发送者(对于 git,即评论作者的 forge 用户名(登录名);["*"] 接受任何人),可选地为跨 agent 分发指定 peer agents,配置一个 ignore 黑名单,以及一个 output_modalitymirrorvoicetext)。有关字段说明,请参见 Peer Groups

在何处设置:

网关仪表板

在 Web 仪表板中打开 /config/peer_groups

zerocode

Config 窗格中的 Peer groups 下。

工作原理

  • 轮询,而不是 webhooks。 该通道通过 since 游标轮询 forge REST API,以获取新的 issues、pull requests 和 comments。守护进程无需公共 URL、隧道或入站暴露;它可以在 NAT 后正常工作。
  • 问题范围内的对话。 同一 issue 或 PR 上的每条消息共享一个对话线程;代理作为该 issue 上的评论进行回复。
  • 流式回复。 代理会先发布一条草稿评论,并在响应逐步增长时就地编辑它(编辑间隔 ≥ 2 秒,以遵守 forge 滥用限制)。
  • 反应。 确认反应会映射到 forge 的反应集合(在 GitHub 中:👀 → eyes,✅ → +1,⚠️ → confused,…);无法映射的 emoji 会被跳过。
  • 冷启动。 在守护进程启动之前创建的事件永远不会被处理,因此重启无法重放历史记录。另一方面:守护进程停机期间发布的评论会被错过,因此请再次提及该应用。
  • 评论编辑会被忽略。 只有新建的评论以及 issue/PR 的开启帖子才会触发该 agent。

凭证

每个提供商的身份验证方式都不同,并且每个都有完整的分步说明:

配置

在您偏好的任一表面上设置通道字段:

网关仪表板

在 Web 仪表板中打开 /config/channels/git

zerocode

Config 窗格中,Channels 下。

完整字段参考,直接来自模式:

access_token 🔑 secret · default ""

用于 Gitea/Forgejo API 请求的个人访问令牌。该令牌需要仓库读取权限,以及用于回复和反应的 issue/PR 评论写入权限。仅适用于 Gitea/Forgejo 提供方。

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.access_token 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.access_token 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.access_token    # 掩码输入,加密存储

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__access_token=
api_base_url string? · default

Gitea/Forgejo API 基础 URL,包括 /api/v1,例如 https://git.example.org/api/v1(对于公共 Gitea 服务:https://gitea.com/api/v1)。当 provider"gitea""forgejo" 时必填——没有默认主机,因为每个 API 请求都携带 access_token;该通道会在启动时关闭失败,而不是将令牌发送到操作员从未指定的端点。仅适用于 Gitea/Forgejo provider。

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.api_base_url 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.api_base_url 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.api_base_url <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__api_base_url=
app_id integer · default 0

GitHub App ID(显示在应用的设置页面上)。仅适用于 GitHub provider。

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.app_id 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.app_id 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.app_id <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__app_id=
events map · default {}

按事件路由表,以规范化事件类型为键("issue_comment.created""pull_request.opened""workflow_run.failed",……)。路由表中不存在的事件类型会回退到会话默认值:issue_comment.createdissues.openedpull_request.opened 会作为消息投递(按提及门控);其他内容都将被忽略。轮询哪些 API 端点由该表派生;对某个事件类型进行路由也就等同于订阅它。

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.events 字段。

zerocode

Config 窗格中,设置 channels.git.<alias>.events 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.events <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__events=
events_backbone bool · default false

此外,将仓库 Events API(/repos/{owner}/{repo}/events)也作为一种广泛的骨干传输方式进行轮询:每个仓库每个 tick 仅发起一次条件(ETag)请求,因此空闲仓库几乎不产生成本。注意事项:事件到达可能有约 5 分钟的延迟,且该 feed 不包含 Actions/check 事件(workflow runs 始终使用其专用端点)。也会对通过目标端点呈现的项目进行去重。默认值:false

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.events_backbone 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.events_backbone 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.events_backbone <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__events_backbone=
excluded_tools string[] · default []

从此通道的工具规范中排除的工具。设置后,通过此通道响应时不会向模型公开这些工具。

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.excluded_tools 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.excluded_tools 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.excluded_tools <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__excluded_tools=
installation_id integer? · default

要充当的安装 ID。未设置时,应用的安装会在首次使用时列出,并自动选择唯一的安装;如果应用有零个或多个安装,则启动失败。

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.installation_id 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.installation_id 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.installation_id <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__installation_id=
listen_to_bots bool · default false

处理由其他机器人帐户撰写的评论。应用自身的评论始终被忽略。默认值:false

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.listen_to_bots 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.listen_to_bots 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.listen_to_bots <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__listen_to_bots=
mention_only bool · default true

仅响应 @-提及应用机器人登录的评论。默认值:true

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.mention_only 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.mention_only 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.mention_only <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__mention_only=
poll_interval_secs integer · default 30

新问题和评论的轮询间隔(秒)。低于 15 的值会被钳制为 15。默认值:30

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.poll_interval_secs 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.poll_interval_secs 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.poll_interval_secs <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__poll_interval_secs=
private_key 🔑 secret · default

RS256 私钥 PEM,即 GitHub 在应用设置页生成的 .pem 文件内容,内联并在静态存储时加密。包括 BEGIN/END 行。仅 GitHub 提供程序。

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.private_key 字段。

zerocode

Config 窗格中,设置 channels.git.<alias>.private_key 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.private_key    # 掩码输入,加密存储

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__private_key=
private_key_path string? · default

RS256 私钥 .pem 文件的 Filesystem 路径,在 private_key(内联 PEM)未设置时于启动时读取。用于早于内联 PEM 字段的配置的向后兼容回退。仅适用于 GitHub provider。

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.private_key_path 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.private_key_path 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.private_key_path <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__private_key_path=
provider string · default "github"

Git 托管提供方。支持:"github""gitea""forgejo"(Forgejo 使用与 Gitea 兼容的 REST 提供方)。默认:"github"

将它放置在任何表面上:

网关仪表板

打开/config/channels/git,并设置 channels.git.<alias>.provider 字段。

zerocode

Config 窗格中,设置 channels.git.<alias>.provider 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.provider <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__provider=
proxy_url string? · default

用于 GitHub API 请求的按通道代理覆盖。

将它放置在任何表面上:

网关仪表板

打开/config/channels/git并设置channels.git.<alias>.proxy_url字段。

zerocode

Config 面板中,设置 channels.git.<alias>.proxy_url 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.proxy_url <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__proxy_url=
repos string[] · default []

要轮询的仓库,格式为 owner/repo。留空 = 安装可见的每个仓库。

将它放置在任何表面上:

网关仪表板

打开 /config/channels/git 并设置 channels.git.<alias>.repos 字段。

zerocode

Config 面板中,设置 channels.git.<alias>.repos 字段。

zeroclaw config

zeroclaw config set channels.git.<alias>.repos <value>

环境变量

导出此覆盖配置(POSIX shell;可放入 ~/.bashrc~/.zshrc.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:

export ZEROCLAW_channels__git__<alias>__repos=

default 别名是通常使用的第一个实例。一次性发送也会解析到它:zeroclaw channel send --channel-id git 会专门查找 default 别名,因此请将实例命名为 default,除非所有发送都来自绑定到其他名称别名的代理。将 repos 留空可轮询凭据可见的所有仓库,或将其设置为明确的仓库列表以降低速率使用量。仅当需要处理其他机器人账户的评论时,才设置 listen_to_bots。未知的 provider 值会产生明确的启动错误,而不是静默回退。

各个 provider 的凭据设置不同,并且每个都有自己的加密 secret;两个 walkthrough 都从头到尾涵盖了它:

事件与路由

除会话之外,channel 会将仓库活动规范化为类型化事件,并按配置路由每种事件类型。将某个事件路由到 sop 会把它派发到一个 Standard Operating Procedure,这是一种具有触发器匹配和审批关卡的确定性、可审计流程。Git SOP fan-in 页面详细说明了 forge 事件如何精确地变为一次 SOP 运行。

事件类型示例路由结果
pull_request.openedsop = pr-triage将 PR 载荷发送到 pr-triage SOP。
issues.openedsop = issue-triage将 issue 负载分派到 issue-triage SOP。
issue_comment.createdmessage = true将该评论传递给正常的对话式代理循环。
workflow_run.failedsop = ci-failure将 CI 失败负载发送到 SOP 入口。
release.publishedmessage = true将发布事件传递给常规代理循环。

已知事件类型:issue_comment.createdissues.openedpull_request.openedpull_request.closedpull_request.mergedpull_request_review_comment.createdworkflow_run.completedworkflow_run.failedrelease.published

  • 默认值。 在没有 events 表时,channel 以会话式方式运行:issue_comment.createdissues.openedpull_request.opened 会作为消息投递(如上所述,受 mention 门控);其他所有内容都会被忽略。对于非空表中缺失的事件类型,适用相同的按类型默认值:列出 workflow_run.failed 不会关闭会话。既没有 message = true 也没有 sop 的条目会显式禁用该事件类型。
  • 路由某个事件类型就等于订阅它。 该通道会从表中推导出要轮询哪些 API 端点:只有当相应的事件类型被路由时,才会获取审查评论、发布和 Actions 运行,因此未配置的通道成本与之前完全相同。GitHub 目前覆盖了所有列出的事件类型;Gitea/Forgejo 提供程序覆盖 issue 评论、issue/PR 创建、PR 关闭/合并转换、发布、回复、编辑、删除和反应。
  • sop 路由。 sop 路由会发出一个由 channel 提供的、主题为 git.<alias>:<event_type> 的 SOP 事件,并携带结构化 JSON 负载。路由后的事件由 SOP 入口消费,而不是作为聊天消息传递。通过在 SOP.toml 中使用用于指定 channel 和实例的 channel 触发器来匹配它(channel = "git"alias = "main");git.<alias>:<event_type> 字符串是由 channel 生成的事件主题,而不是触发器字段。使用可选的 condition 进一步缩小范围,例如 $.event_type == "pull_request.opened"$.repo == "octo/repo"
  • 按路由进行 mention 门控。 mention_only 门控适用于消息路径上的对话事件。sop-路由事件会跳过它:路由到 pr-triage 的 PR 会被捕获,无论作者是否提到了应用。生命周期/CI/发布事件没有 mention 入口,因此从不受门控。应用自身的活动始终会被丢弃;其他 bot 的活动遵循 listen_to_bots;每次投递都会基于作者的登录名通过 peer-group allowlist。
  • 回复表面。 评论、issue 和 PR 事件会回复到其 issue/PR 线程。工作流运行事件会在 forge 报告有关联的 PR 时回复到该运行关联的 PR;否则,对于发布,目标是裸仓库,且代理无法在平台上回复(将这些路由到 SOP 或通过其他工具操作)。
  • Events API backbone(可选,GitHub)。 events_backbone = true 还会使用 ETag 条件请求轮询 /repos/{owner}/{repo}/events(每个 repo 每个 tick 一次请求;空闲 repo 会返回 304,几乎没有成本)。注意事项:该 feed 最多会滞后约 5 分钟,payload 会被裁剪,而且 Actions events never appear in it:workflow runs 始终使用其专用 endpoint。凡是同时出现在 feed 和目标 endpoint 中的内容都会去重,因此可以安全组合。Gitea/Forgejo 目前会忽略此选项。

操作说明

  • **速率预算:**在 GitHub 上,每个安装每小时获得 5,000 个请求;会话式默认配置在每个轮询 tick 中每个仓库消耗 2 个请求(5 个仓库、30 秒间隔 ≈ 每小时 1,200 个)。每个额外路由的端点族(review comments、releases、Actions runs)会为每个仓库每个 tick 再增加 1 个请求,而 Events API 骨干会增加 1 个条件请求(空闲仓库上的 304 在实际上是免费的)。Gitea/Forgejo 的速率限制取决于实例。在收到速率限制响应时,通道会退避,直到限制窗口重置。
  • 多个仓库:repos 为空且凭据可见的仓库超过 100 个时,仅轮询第一页(GitHub 会记录一条警告)。在这种情况下请显式列出 repos

安全

公开仓库上的 issue 和 PR 评论属于对抗性输入。保持 mention_only = true,通过 peer group 对发送者进行限制(空 peer 集拒绝所有人,["*"] 接受任何人),并且对于面向公众的仓库,将 autonomy 保持在 Supervised 或更低。这与 social channels 的指导相同。

相关文档