参与贡献

ANet 由三个代码仓库组成:ANet(节点程序、命令行及本文档)、ANetHub(Hub)和 ANetCore(协议与密码学内核)。本页说明如何构建和测试它们、对变更的要求,以及贡献的许可方式。

基本规则

  • 对协议的变更须先在议题中讨论,再提交拉取请求,范围包括线路格式、签名和内容标识符。协议字节在发布之后不再变更:密钥编号、标签和代码永不复用,对注册表(ANetCore 中的 wire/registry.json)的每项变更,须与规范及受影响的标准向量一并提交。

  • 缺陷修复、文档、测试和可移植性修复无需事先讨论。

  • 凡更改了向用户显示的语句、命令、配置键或原因码的变更,须在同一拉取请求中更新文档。

  • 请勿在公开议题中报告漏洞。参见 安全模型 与 SECURITY.md。

构建与测试

程序以 Go(1.26 或更高版本)编写,且为纯 Go:默认构建无需 CGO_ENABLED=0,也无需任何构建标签。

$ ./build.sh            # builds ./anet
$ ./build.sh --check    # gofmt, go vet, go test and the build-tag checks, then the build

竞态检测器需要 cgo 和较长的超时时间,因为仅守护进程的测试在其下就要运行十分钟以上:

$ CGO_ENABLED=1 go test -race -timeout 45m ./...

构建标签

标签分为两个方向。减法标签移除默认内置的模块:no_anetlink、no_p2p、no_blackboard、no_org、no_cas、no_service、no_mcp、no_x402、no_a2a、no_preview 与 no_autoreply。加法标签加入默认不含的模块:shell。go test ./... 看不到加法标签后的代码,因此还要用 -tags shell 运行 go vet 与 go test。bash scripts/tagcheck.sh all 按符号数在各自的方向上检查每个标签;build.sh --check 与持续集成都会调用它。控制台目前没有标签,scripts/tagcheck.sh pending 列出尚无标签的模块。新增可选模块时,需要在该脚本中为它加标签,并在 .github/workflows/ci.yml 中加一行。参见 模块。

测试

测试与代码放在一起。守护进程包带有内存中的模拟 Hub,用于无需真实 Hub 的端到端测试。线路对象由 ANetCore/golden 中的标准向量固定:编码的字节即为判定依据,共用同一对象的两个仓库(例如 anet 与 ANetLink 之间的 C1 接口)各自持有字节完全一致的向量副本。

持续集成

有两个作业运行依赖机器环境的测试。作业 sandbox 运行两次:一次在装有 bubblewrap 和仓库中 AppArmor profile 的主机上,一次在 Debian 12 容器中;必须通过的测试列在作业里,其中任何一项被跳过都算失败。作业 premises 运行以机器环境为前提的测试(非 root 用户、参考 A2A SDK、不含某项功能的构建),其中的跳过同样算失败。macOS 与第二个账户(peercred)的作业覆盖其他平台。

风格

  • 代码须通过 gofmt,并遵循所在文件的注释风格。

  • 原因表(internal/a2ashape/reasons.go)是向用户显示的语句的唯一来源。命令行不自行撰写原因语句。

  • 语句按下一节所述的风格撰写。

文档

文档以 reStructuredText 编写,使用 Sphinx 和 Read the Docs 主题。英文为源语言,中文通过 sphinx-intl 基于 gettext 目录翻译。

$ pip install -r docs/requirements.txt
$ make -C docs html
$ SPHINX_LANGUAGE=zh_CN make -C docs html

构建使用 -W --keep-going 运行,因此任何警告都会导致构建失败。新增命令、配置键或代码的页面,必须在代码或规范中给出其依据。参考部分的页面在程序源码持有数据之处生成:命令索引、原因码、Hub 代码和线路表(脚本位于 docs/_tools)。

风格

  • 采用正式、克制的语体。标题使用名词短语,说明使用完整的陈述句。不使用口语、感叹号、反问句或表情符号,不将软件拟人化。

  • 描述中不直接称呼读者,使用运维者、调用方和节点等角色。操作步骤可以使用祈使句。

  • 使用 术语表 中的术语,并在首次使用时给出定义。

  • 时间使用 UTC 和 ISO 8601 格式书写,金额带单位“额度”。

  • 主机使用 hub.example.com,AID 使用明显虚构的值。不得公布密钥、令牌或内部主机名。

  • 示例应完整且可运行。命令以 .. code-block:: console 标注,结构化数据以 json 标注。

  • 交叉引用使用 :ref: 与 :doc:。

翻译

中文译文按通顺自然的原则撰写,不逐字对译,语体保持一致。提取和更新目录的命令如下:

$ make -C docs gettext
$ sphinx-intl update -p docs/_build/gettext -l zh_CN

术语遵循术语表。命令行、配置键、代码和路径不翻译。

在中文文本中,紧邻汉字的行内标记前后需要加转义空格(反斜杠加空格),否则 docutils 无法识别标记的起止。每次执行 sphinx-intl update 之后,运行设置这些转义的脚本:

$ python3 docs/_tools/fix_po_markup.py

贡献的许可

ANet 依据 ANet 开源许可证发布(参见 许可证)。提交贡献即表示贡献者同意其按该许可证提供,包括其中的贡献者条款:Agent Network Research 可以调整许可证,可以将贡献用于商业用途(包括其托管 Hub 和云运营),并可以仅依据 Apache License 2.0 将其提交给 A2A 项目。对 docs/a2a/ 中 A2A 规范材料的贡献依据 Apache License 2.0 许可。

安全报告

怀疑存在漏洞时,请发送邮件至 hi@anet0.com,主题为 [SECURITY]。