浏览 1.0.0 文档
1.0.0 文档修订 2

附录:发布 manifest

展开通用命令适配器与专用 AIT 原生家族发布 manifest 的 schema、边界与归属规则。

适用人群: 发布工程师与包维护者

发布清单#

1.0.0 有两份发布清单约定,适用范围不同:

文件档位与用途
ait-release.jsongeneric-command:可复用的发布适配器,面向一个包及其一个或多个组件。
ait-release-family.jsonfamily:专用协调器,面向官方的 AIT 原生 release family。

这两个文件都从记录下来的发布源 Snapshot 里读取。未知字段会被拒绝,路径 按仓库相对路径规范化,各项声明还会拿那个 Snapshot 里实际存在的文件来 核对。

通用适配器:ait-release.json#

Code · json
{
  "schema": "ait.release.adapter/v1",
  "package": {
    "name": "sample-tool",
    "version": "1.2.0",
    "description": "Portable sample package.",
    "license_files": [
      {"path": "LICENSE", "role": "license"},
      {"path": "NOTICE", "role": "notice"}
    ]
  },
  "components": [
    {
      "id": "cli",
      "ecosystem": "native",
      "working_directory": ".",
      "dependency_files": ["Cargo.toml", "Cargo.lock"],
      "commands": {
        "prepare": [],
        "test": [["cargo", "test", "--locked"]],
        "build": [["cargo", "build", "--release", "--locked"]],
        "smoke": [["target/release/sample-tool", "--version"]]
      },
      "artifacts": [
        {"path": "target/release/sample-tool", "kind": "native-executable"}
      ]
    }
  ]
}

根字段与 package 字段#

字段约定
schema确切字符串 ait.release.adapter/v1
package必填对象。
package.name必填,非空的有界单行字符串。
package.version必填,非空的有界单行字符串。
package.description可选的字符串或 null
package.license_files可选数组,1 到 8 条。
license_files[].path指向发布源中某个文件的规范化相对路径。路径必须唯一。
license_files[].role确切的 licensenotice;每种 role 最多出现一次。
components必填数组,1 到 64 个组件对象。

组件字段#

字段约定
id必填标识符,在各组件之间唯一。
ecosystem必填标识符,描述该组件的工具链。
working_directory必填的规范化相对目录,根目录写 .。它必须存在于源 Snapshot 中。
dependency_files1 到 64 个相对于 working_directory 的唯一规范化路径;每个文件都必须存在。
commands必填对象,只能包含 preparetestbuildsmoke
artifacts1 到 128 条产物记录。

命令阶段#

每条命令都是 argv 数组,不是 shell 字符串。testbuild 是必填的, 各自必须含 1 到 16 条命令。preparesmoke 可选,可以含 0 到 16 条 命令。每条命令含 1 到 64 个字符串参数;可执行文件那个参数不能为空。

命令直接执行,不隐式套 shell。1.0.0 只替换与下列 token 之一完全相等的 整个 argv 值:

Code · text
$AIT_RELEASE_ID
$AIT_RELEASE_VERSION
$AIT_RELEASE_COMPONENT
$AIT_RELEASE_ECOSYSTEM
$AIT_RELEASE_TARGET
$SOURCE_DATE_EPOCH

这些 token 不做子串插值,也不构成任意环境变量展开的许可。argv 值里出现 换行、回车和 NUL 字符会被拒绝。

产物字段#

字段约定
path必填的规范化相对输出路径,在组件内唯一。
kind必填标识符,比如 native-executablepython-wheel,或适配器自定义的其他 kind。
target可选标识符。不写表示这是可移植产物;写了则把该产物关联到某一个发布目标。

选定的构建必须把声明的每个产物都产出为确切的普通文件。选定某个目标时, 会包含匹配该目标的产物;选择可移植集合时,只包含没有 target 的产物。

通用上限#

清单大小上限为 1 MiB。标识符以 ASCII 字母或数字开头,之后可用字母、数字、 ._-。文本字段是有界的单行字符串。相对路径用 /,不能是绝对 路径,也不能包含空段、... 段、盘符前缀、冒号或反斜杠。

AIT 家族协调器:ait-release-family.json#

这不是一份通用的多项目清单。约定 ait.release.family/v3 负责协调官方 AIT 原生组件、目标、公开源码投影和分发身份。

Code · json
{
  "schema": "ait.release.family/v3",
  "family": {
    "name": "ait-native",
    "version": "1.0.0",
    "channel": "rc",
    "tag": "v1.0.0"
  },
  "targets": ["aarch64-apple-darwin", "x86_64-unknown-linux-gnu"],
  "public_source": {},
  "components": [],
  "distributions": [],
  "compatibility": {}
}

上面那些空对象和空数组只是展示根层形状,它们不是一份有效的发布。真正的 家族清单必须满足下面所有的关系约束。

家族身份与目标矩阵#

字段约定
schema确切字符串 ait.release.family/v3
family.name必填标识符。
family.version稳定版 MAJOR.MINOR.PATCH 或 RC 版 MAJOR.MINOR.PATCH-rc.N,要和 channel 对得上。
family.channel确切的 rcstable
family.tag确切的 v 加上 family.version
targets1 到 32 个唯一的目标标识符。

组件#

components 含 1 到 64 个唯一的组件对象。

字段约定
id必填的唯一组件标识符。
source_repository必填的源 Repository 标识符。在 v3 的公开源码模式下,它必须是 ait-coreait-serverait-runnerait-pythonait-node 之一。
source_snapshot必填,有效且确切的 Snapshot ID。
ecosystem必填标识符。
license必填的有界 SPDX 风格表达式。
version_schemefamilypep440
versionfamily 时必须等于家族版本,取 pep440 时必须是它对应的规范 PEP 440 映射值。
artifacts1 到 32 条唯一的产物要求。
artifacts[].kind必填的产物 kind 标识符。
artifacts[].targets取自根目标矩阵的唯一目标标识符。空数组表示该 kind 只有一个可移植产物。

产物 kind 和 target 组成的二元组,在同一个组件内不得重复。

分发#

distributions 含 1 到 128 条记录。每个组件都必须被至少一条分发覆盖到。

字段约定
channelgithubpypinpmocihomebrewaptwinget
roleproductstandaloneimplementation
identity必填的有界分发身份;channel 与 identity 这一对必须唯一。
components1 到 64 个已声明的组件 ID。
targets取自家族矩阵的 1 到 32 个目标。选中的每个组件都必须提供该目标,或者提供可移植产物。

public_source#

v3 的公开源码对象故意定得很死,因为它产出的是一个可评审的发布 monorepo。

字段约定
model确切的 release-monorepo
identity确切的官方公开源码身份 weita2026/ait-native
product_document确切的 docs/distribution.md
family_manifest确切的 ait-release-family.json
mapping_manifest确切的 ait-monorepo-source.json
build_entrypoints.unix确切的 build-release.sh
build_entrypoints.windows确切的 build-release.ps1
build_entrypoints.implementation确切的 build-release.mjs
subtrees各组件用到的每个源 Repository 各占一条。
subtrees[].source_repository已声明的源 Repository。
subtrees[].path同名的确切公开目录。
subtrees[].transforms按顺序作用于该 subtree 的、在允许清单内的 transform ID。
transforms所选源 Repository 集合所需的确切 transform 定义。
transforms[].id有界的 ASCII ID,以 /v1 结尾。
transforms[].source_repository拥有它的源 Repository。
transforms[].pathfromto该 transform ID 对应的、在允许清单内的确切路径重写三元组。

当前的允许清单里,只有 runner 和 Python 源码 subtree 所需的同级 core 路径 投影。任意改写源码不是这份清单的扩展机制。那唯一一条 GitHub product 分发 必须使用同一个公开身份,并覆盖家族里的每个组件和每个目标。

兼容性映射#

compatibility 是必填对象,最多 64 条。每个 key 是一个标识符,每个 value 是非空的有界单行字符串。它记录的是面向使用者的兼容性事实;它不替代组件 版本、Snapshot 锁定或目标矩阵。

评审边界#

  • 清单的改动,要和它引用的源码及依赖文件改动记进同一个 Snapshot。
  • 更新组件的 source_snapshot 之前,一定要先评审它接纳的产物、许可证、 版本和分发覆盖情况。
  • 生成出来的候选、检查、构建、冻结、晋级、校验和、映射与回执文件,别放 进这份编写参考里。它们是发布输出,不是额外的用户配置文件。
  • 用完整的 ait release 命令参考去创建、检查、构建和查看发布证据;不要 手写输出回执。

相关参考#

Version authority

Checked against the exact 1.0.0 source

This page is public documentation, not a second product contract. Use the exact source and distribution contract for release authority.

Owning component Snapshots
  • ait-coreSNP-B06A48DA0245
  • ait-serverSNP-E90456E6425E
  • ait-runnerSNP-6B0A1BB3AFAD
  • ait-pythonSNP-973E3BFAF3DE
  • ait-nodeSNP-F962CC66AA62