附录:发布 manifest
展开通用命令适配器与专用 AIT 原生家族发布 manifest 的 schema、边界与归属规则。
适用人群: 发布工程师与包维护者
发布清单#
1.0.0 有两份发布清单约定,适用范围不同:
| 文件 | 档位与用途 |
|---|---|
ait-release.json | generic-command:可复用的发布适配器,面向一个包及其一个或多个组件。 |
ait-release-family.json | family:专用协调器,面向官方的 AIT 原生 release family。 |
这两个文件都从记录下来的发布源 Snapshot 里读取。未知字段会被拒绝,路径 按仓库相对路径规范化,各项声明还会拿那个 Snapshot 里实际存在的文件来 核对。
通用适配器:ait-release.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 | 确切的 license 或 notice;每种 role 最多出现一次。 |
components | 必填数组,1 到 64 个组件对象。 |
组件字段#
| 字段 | 约定 |
|---|---|
id | 必填标识符,在各组件之间唯一。 |
ecosystem | 必填标识符,描述该组件的工具链。 |
working_directory | 必填的规范化相对目录,根目录写 .。它必须存在于源 Snapshot 中。 |
dependency_files | 1 到 64 个相对于 working_directory 的唯一规范化路径;每个文件都必须存在。 |
commands | 必填对象,只能包含 prepare、test、build 和 smoke。 |
artifacts | 1 到 128 条产物记录。 |
命令阶段#
每条命令都是 argv 数组,不是 shell 字符串。test 和 build 是必填的, 各自必须含 1 到 16 条命令。prepare 和 smoke 可选,可以含 0 到 16 条 命令。每条命令含 1 到 64 个字符串参数;可执行文件那个参数不能为空。
命令直接执行,不隐式套 shell。1.0.0 只替换与下列 token 之一完全相等的 整个 argv 值:
$AIT_RELEASE_ID
$AIT_RELEASE_VERSION
$AIT_RELEASE_COMPONENT
$AIT_RELEASE_ECOSYSTEM
$AIT_RELEASE_TARGET
$SOURCE_DATE_EPOCH这些 token 不做子串插值,也不构成任意环境变量展开的许可。argv 值里出现 换行、回车和 NUL 字符会被拒绝。
产物字段#
| 字段 | 约定 |
|---|---|
path | 必填的规范化相对输出路径,在组件内唯一。 |
kind | 必填标识符,比如 native-executable、python-wheel,或适配器自定义的其他 kind。 |
target | 可选标识符。不写表示这是可移植产物;写了则把该产物关联到某一个发布目标。 |
选定的构建必须把声明的每个产物都产出为确切的普通文件。选定某个目标时, 会包含匹配该目标的产物;选择可移植集合时,只包含没有 target 的产物。
通用上限#
清单大小上限为 1 MiB。标识符以 ASCII 字母或数字开头,之后可用字母、数字、 .、_ 或 -。文本字段是有界的单行字符串。相对路径用 /,不能是绝对 路径,也不能包含空段、.、.. 段、盘符前缀、冒号或反斜杠。
AIT 家族协调器:ait-release-family.json#
这不是一份通用的多项目清单。约定 ait.release.family/v3 负责协调官方 AIT 原生组件、目标、公开源码投影和分发身份。
{
"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 | 确切的 rc 或 stable。 |
family.tag | 确切的 v 加上 family.version。 |
targets | 1 到 32 个唯一的目标标识符。 |
组件#
components 含 1 到 64 个唯一的组件对象。
| 字段 | 约定 |
|---|---|
id | 必填的唯一组件标识符。 |
source_repository | 必填的源 Repository 标识符。在 v3 的公开源码模式下,它必须是 ait-core、ait-server、ait-runner、ait-python 或 ait-node 之一。 |
source_snapshot | 必填,有效且确切的 Snapshot ID。 |
ecosystem | 必填标识符。 |
license | 必填的有界 SPDX 风格表达式。 |
version_scheme | family 或 pep440。 |
version | 取 family 时必须等于家族版本,取 pep440 时必须是它对应的规范 PEP 440 映射值。 |
artifacts | 1 到 32 条唯一的产物要求。 |
artifacts[].kind | 必填的产物 kind 标识符。 |
artifacts[].targets | 取自根目标矩阵的唯一目标标识符。空数组表示该 kind 只有一个可移植产物。 |
产物 kind 和 target 组成的二元组,在同一个组件内不得重复。
分发#
distributions 含 1 到 128 条记录。每个组件都必须被至少一条分发覆盖到。
| 字段 | 约定 |
|---|---|
channel | github、pypi、npm、oci、homebrew、apt 或 winget。 |
role | product、standalone 或 implementation。 |
identity | 必填的有界分发身份;channel 与 identity 这一对必须唯一。 |
components | 1 到 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[].path、from、to | 该 transform ID 对应的、在允许清单内的确切路径重写三元组。 |
当前的允许清单里,只有 runner 和 Python 源码 subtree 所需的同级 core 路径 投影。任意改写源码不是这份清单的扩展机制。那唯一一条 GitHub product 分发 必须使用同一个公开身份,并覆盖家族里的每个组件和每个目标。
兼容性映射#
compatibility 是必填对象,最多 64 条。每个 key 是一个标识符,每个 value 是非空的有界单行字符串。它记录的是面向使用者的兼容性事实;它不替代组件 版本、Snapshot 锁定或目标矩阵。
评审边界#
- 清单的改动,要和它引用的源码及依赖文件改动记进同一个 Snapshot。
- 更新组件的
source_snapshot之前,一定要先评审它接纳的产物、许可证、 版本和分发覆盖情况。 - 生成出来的候选、检查、构建、冻结、晋级、校验和、映射与回执文件,别放 进这份编写参考里。它们是发布输出,不是额外的用户配置文件。
- 用完整的
ait release命令参考去创建、检查、构建和查看发布证据;不要 手写输出回执。