Fragment Manifest 规格#
Draft v0.1 · 定义 Fragment
manifest.toml的完整格式规格
概述#
Fragment 是 AgentForge 世界可移植性三层模型中的中间层——介于不可分割的 Kernel 与即插即用的 Capability 之间。每个 Fragment 代表一组领域内聚的规则、技能、脚本与文档的组合,可独立版本化、可选安装、可自由组合。
本文档定义 Fragment 自身的声明式描述文件 manifest.toml 的完整格式,使 Fragment 能够:
在不同世界之间可移植、可复用
声明对 Kernel 版本的兼容性约束
声明对其他 Fragment 的依赖与冲突
支持生命周期钩子与扩展元数据
设计原则#
原则 |
含义 |
|---|---|
语言无关 |
manifest.toml 使用 TOML 格式,任何语言/工具均可解析,不绑定特定运行时 |
声明式 |
只描述"是什么",不规定"怎么做";状态由消费者自行推导 |
可组合 |
多个 Fragment 可自由组合安装,通过 |
极简必需 |
仅 |
manifest.toml 完整字段定义#
Fragment 的 manifest.toml 放置于 Fragment 根目录,包含以下 section:
flowchart TD
A["manifest.toml"] --> B["[fragment]"]
A --> C["[fragment.kernel-compat]"]
A --> D["[fragment.dependencies]"]
A --> E["[fragment.conflicts]"]
A --> F["[fragment.contents]"]
A --> G["[fragment.hooks]"]
A --> H["[fragment.metadata]"]
[fragment] — 基础元数据#
字段 |
类型 |
必填 |
默认值 |
语义 |
|---|---|---|---|---|
|
string |
是 |
— |
Fragment 标识符,使用 kebab-case(如 |
|
string |
是 |
— |
语义化版本号,遵循 SemVer 2.0 |
|
string |
是 |
— |
一句话功能描述,面向人类阅读 |
|
string[] |
否 |
|
作者列表,建议格式 |
|
string |
否 |
|
SPDX 许可证标识符 |
|
string[] |
否 |
|
分类标签,用于搜索与过滤 |
|
string |
否 |
— |
Fragment 源码仓库 URL |
[fragment.kernel-compat] — Kernel 版本兼容性#
声明本 Fragment 对世界 Kernel 最低版本的要求,以及已知不兼容的最高版本。
字段 |
类型 |
必填 |
默认值 |
语义 |
|---|---|---|---|---|
|
string |
否 |
|
Kernel 最低兼容版本(含) |
|
string |
否 |
— |
Kernel 不兼容版本(排他,即 |
备注
max-version 遵循 SemVer 排他语义:max-version = "4.0.0" 表示兼容 < 4.0.0 的所有 Kernel 版本。这与 Cargo 的 semver 约定一致。
[fragment.dependencies] — Fragment 间依赖#
声明本 Fragment 对其他 Fragment 的版本约束。Key 为 Fragment name,Value 为版本约束字符串。
字段 |
类型 |
必填 |
默认值 |
语义 |
|---|---|---|---|---|
|
string |
否 |
— |
依赖的 Fragment 名称 → 版本约束字符串 |
版本约束语法详见 版本约束语法。
示例:
[fragment.dependencies]
"docs-governance-tools" = ">=2.0"
"citations" = "^1.0"
[fragment.conflicts] — 不兼容声明#
声明与哪些 Fragment 不兼容。Key 为冲突 Fragment 的 name,Value 为冲突原因说明。
字段 |
类型 |
必填 |
默认值 |
语义 |
|---|---|---|---|---|
|
string |
否 |
— |
冲突 Fragment 名称 → 冲突原因描述 |
示例:
[fragment.conflicts]
"legacy-python-lint" = "与本 Fragment 的 ruff 配置冲突"
[fragment.contents] — 内容清单#
声明 Fragment 包含的资源,按类型分组。所有路径均为相对于 Fragment 根目录的相对路径。
字段 |
类型 |
必填 |
默认值 |
语义 |
|---|---|---|---|---|
|
string[] |
否 |
|
规则文件列表 |
|
string[] |
否 |
|
技能目录/文件列表 |
|
string[] |
否 |
|
脚本文件列表 |
|
string[] |
否 |
|
参考文档列表 |
|
string[] |
否 |
|
模板文件列表 |
路径约定:
以
/结尾的路径表示目录(包含其下所有文件)不以
/结尾的路径表示具体文件路径不允许包含
..(禁止上溯到 Fragment 根之外)
[fragment.hooks] — 生命周期钩子#
声明 Fragment 安装/卸载/升级时需执行的操作。Value 为可执行命令字符串。
字段 |
类型 |
必填 |
默认值 |
语义 |
|---|---|---|---|---|
|
string |
否 |
— |
Fragment 安装完成后执行的命令 |
|
string |
否 |
— |
Fragment 卸载前执行的命令 |
|
string |
否 |
— |
Fragment 升级完成后执行的命令 |
警告
钩子命令在世界的宿主环境中执行,应尽量保持简单与幂等。推荐仅用于校验或轻量初始化,避免破坏性操作。
[fragment.metadata] — 扩展元数据#
自由格式的 key-value 对,用于存放项目特定的扩展信息,不影响 Fragment 的解析与校验。
字段 |
类型 |
必填 |
默认值 |
语义 |
|---|---|---|---|---|
(任意) |
string / number / boolean |
否 |
— |
自定义键值对,消费者按需读取 |
[fragment.metadata]
domain = "engineering"
maturity = "stable"
internal-id = "PE-001"
版本约束语法#
Fragment 的版本约束对齐 SemVer 2.0,采用 Cargo 风格的表达式:
语法 |
含义 |
示例 |
|---|---|---|
|
大于等于指定版本 |
|
|
兼容范围:同 major 版本 |
|
|
补丁范围:同 minor 版本 |
|
|
区间组合 |
|
|
任意版本 |
|
|
精确版本 |
|
约束解析规则#
^插值规则(Caret):^1.2.3→>=1.2.3, <2.0.0(major ≥ 1 时,锁定 major)^0.2.3→>=0.2.3, <0.3.0(major = 0 时,锁定 minor)^0.0.3→>=0.0.3, <0.0.4(major.minor = 0.0 时,锁定 patch)
~插值规则(Tilde):~1.2.3→>=1.2.3, <1.3.0(锁定 major.minor)~1.2→>=1.2.0, <1.3.0
区间组合:用逗号分隔多个约束,取交集;逗号两侧允许空格。
缺省版本号:
"1.2"等价于">=1.2.0, <2.0.0"(即^1.2)。
完整示例#
以 python-engineering Fragment 为例:
# manifest.toml — python-engineering Fragment
# 位于 .agents/kernel/python-engineering/manifest.toml
[fragment]
name = "python-engineering"
version = "1.2.0"
description = "Python 工程规范与兼容性检查"
authors = ["@agentforge-team"]
license = "MIT"
keywords = ["python", "engineering", "lint", "compatibility"]
repository = "https://github.com/example/agentforge"
[fragment.kernel-compat]
min-version = "3.0.0"
max-version = "4.0.0" # 兼容 < 4.0.0
[fragment.dependencies]
"citations" = "^1.0"
[fragment.conflicts]
# 当前无冲突
[fragment.contents]
rules = ["rules/python.md"]
scripts = [
"scripts/check_python_compat.py",
"scripts/check_python_deprecations.py",
]
docs = ["docs/version-tracking.md"]
[fragment.hooks]
post-install = "python -c 'print(\"python-engineering fragment installed\")'"
[fragment.metadata]
domain = "engineering"
maturity = "stable"
与 world.toml 的关系#
Fragment 的 manifest.toml 是 Fragment 自身的完整规格,而 world.toml 中的 [fragments.*] 是世界对已安装 Fragment 的注册表摘要。两者关系如下:
flowchart LR
A["manifest.toml<br/>(Fragment 自身规格)"] -->|"安装时注册"| B["world.toml [fragments.*]<br/>(世界级注册表摘要)"]
B -->|"卸载时移除"| C["删除对应 [fragments.*] 条目"]
映射规则#
manifest.toml 字段 |
world.toml |
映射说明 |
|---|---|---|
|
section key( |
name 成为 section key |
|
|
直接映射 |
|
|
直接映射 |
|
|
所有 contents 子字段合并为 |
(无对应字段) |
|
Fragment 安装时由安装者指定,默认 |
安装后的 world.toml 示例#
安装 python-engineering Fragment 后,world.toml 中新增:
[fragments.python-engineering]
version = "1.2.0"
includes = [
"rules/python.md",
"scripts/check_python_compat.py",
"scripts/check_python_deprecations.py",
"docs/version-tracking.md",
]
optional = true
description = "Python 工程规范与兼容性检查"
一致性约束#
单一权威源:
manifest.toml是 Fragment 元数据的权威源;world.toml仅为注册摘要,不得脱离 manifest 独立修改版本号或描述。版本同步:Fragment 升级后,必须同步更新
world.toml中对应条目的version和includes。卸载清理:Fragment 卸载时,
world.toml中对应[fragments.*]条目必须一并移除。
校验规则#
manifest.toml 的合法性校验清单如下:
必填字段校验#
[ ]
[fragment]section 存在[ ]
fragment.name非空且符合 kebab-case(^[a-z][a-z0-9-]*[a-z0-9]$)[ ]
fragment.version非空且符合 SemVer 格式(^(\d+)\.(\d+)\.(\d+)(-[a-zA-Z0-9.]+)?$)[ ]
fragment.description非空
版本约束校验#
[ ]
kernel-compat.min-version若存在,符合 SemVer 格式[ ]
kernel-compat.max-version若存在,符合 SemVer 格式[ ]
kernel-compat.min-version<kernel-compat.max-version(当两者均存在时)[ ]
dependencies中所有版本约束字符串可被解析[ ]
conflicts中的 Fragment name 不出现在dependencies中(自相矛盾)
内容路径校验#
[ ]
contents中所有路径以rules/、skills/、scripts/、docs/、templates/之一为前缀[ ] 无路径包含
..(禁止上溯)[ ] 以
/结尾的路径表示目录,不以/结尾的表示文件[ ] 所声明的文件/目录在 Fragment 包内实际存在
语义校验#
[ ]
fragment.name不与 Kernel 或其他已安装 Fragment 重名[ ]
dependencies中引用的 Fragment 在当前世界或 Fragment 仓库中存在[ ]
hooks中的命令为合法可执行字符串(非空、无 shell 注入风险)[ ]
metadata的 key 不与任何已定义 section 字段重名
格式校验#
[ ] 文件为合法 TOML 格式
[ ] 无重复 key
[ ] 字符串值无前后空白(除非有意为之)