Manifest Reference
manifest.json 的 closed-world 字段、包类型、能力、依赖、事件与版本规则。
# 字段总表
| 字段 | 必需 | 类型与规则 |
|---|---|---|
manifest_version | 是 | 必须为 1.0。 |
id | 是 | 小写分段标识;至少包含一个 .、_ 或 - 分隔符。 |
version | 是 | SemVer 三段数字,可带 prerelease。 |
package_type | 是 | 五种公开包类型之一。 |
entrypoint | 是 | 非空 Registrar 类名。 |
capabilities | 是 | 唯一的 capability id 数组。 |
requires | 是 | 必需依赖数组。 |
optional_requires | 否 | 可选依赖数组;每项必须有非空 fallback。 |
lifecycle | 否 | 生命周期声明元数据;实际 handler 仍通过 Registrar 声明。 |
events | 否 | 事件声明对象数组。 |
migrations | 否 | 迁移元数据对象数组;执行对象必须与其匹配。 |
data_ownership | 否 | 唯一、非空 namespace 字符串数组。 |
uninstall_policy | 否 | REMOVE、PRESERVE 或 EXPLICIT_PACKAGE_POLICY;默认 PRESERVE。 |
templates | 否 | 包相对路径数组。 |
assets | 否 | 包相对路径数组。 |
config_schema | 否 | 配置 schema 元数据;运行时 validator 仍通过 Registrar 声明。 |
未知顶层字段会以 manifest.unknown_field 拒绝;缺少必需字段会以 manifest.required_field_missing 拒绝。
# 完整骨架
{
"manifest_version": "1.0",
"id": "vendor.package",
"version": "1.0.0",
"package_type": "business-module",
"entrypoint": "Vendor\\Package\\PackageRegistrar",
"capabilities": [],
"requires": [],
"optional_requires": [],
"lifecycle": [],
"events": [],
"migrations": [],
"data_ownership": [],
"uninstall_policy": "PRESERVE",
"templates": [],
"assets": [],
"config_schema": {}
}# 包类型
| 值 | 用途 | 额外限制 |
|---|---|---|
business-module | 业务行为与自有数据 | 能力仍需按矩阵审批。 |
theme-presentation | 主题和 presentation | 禁止业务 migration;不能提供业务 presentation data。 |
ui-extension | 受限 UI contribution | 禁止 migration、业务 data ownership 和 route.register。 |
provider | 显式 provider contract | 仅限声明的 provider 与自有数据。 |
legacy-adapter | 受审查的迁移边界 | 不会自动获得任何现代 capability。 |
# Capability Reference
| Capability | 允许的包类型 | 说明 |
|---|---|---|
content.read | business-module, provider, legacy-adapter | 受控内容查询;需要审批。 |
content.decorate | 全部类型 | 类型化 UI SLOT 或纯过滤器。 |
content.write | business-module, provider, legacy-adapter | 受控内容命令;需要人工审批。 |
user.profile.read | business-module, ui-extension, provider, legacy-adapter | 最小化、授权后的资料查询。 |
user.profile.write | business-module, provider, legacy-adapter | 受控资料命令。 |
user.group.write | business-module | 需要 Core owner 审批。 |
database.module.read | business-module, provider, legacy-adapter | 只读自己声明的数据命名空间。 |
database.module.write | business-module, provider, legacy-adapter | 只写自己声明的数据命名空间。 |
database.raw-sql.legacy | legacy-adapter | 仅受审查的迁移边界,不是新业务 API。 |
database.core.write | 无 | 所有扩展包均被拒绝。 |
admin.ui.extend | business-module, ui-extension, legacy-adapter | 受控管理界面扩展。 |
network.outbound | business-module, provider, legacy-adapter | 受控 HTTPS 和域名白名单。 |
ui.theme.override | theme-presentation | 命名 presentation target 的主题覆盖。 |
route.register | business-module, theme-presentation, provider, legacy-adapter | 通过 Route Registry 声明;主题只允许 query intent。 |
policy.read | 全部类型 | 通过主机 Policy 接口读取决策。 |
storage.public.read | 全部类型 | 受控公共资源读取和 URL。 |
storage.private.read | business-module, provider, legacy-adapter | 需要资源级授权。 |
storage.module.write | business-module, provider, legacy-adapter | 只写包命名空间。 |
cache.module.write | 全部类型 | 包级命名空间缓存。 |
task.register | business-module, provider, legacy-adapter | 受控任务注册。 |
event.listen | business-module, provider, legacy-adapter | 监听 manifest 已声明的版本化事件。 |
provider.register | business-module, theme-presentation, provider, legacy-adapter | 版本化 Provider;主题只允许唯一 Theme Provider。 |
判定语义:ALLOW 可进入 grant plan;CONDITIONAL 需要显式审批;DENY 永远不能授予。manifest 声明是必要条件,不等于已经获得授权。
# Dependencies
{"kind":"package","name":"source.package","range":">=1.0.0 <2.0.0"}
{"kind":"contract","name":"source.contract","range":"1.0.0","fallback":"FEATURE-DISABLED"}
kind 仅为 package、provider、contract。range 使用以空格分隔的精确比较条件,支持 = > >= < <=;不支持 caret 或 wildcard。每个 package id 同时只能有一个 active version;必需依赖缺失/版本不符会阻止激活;可选依赖缺失或不兼容时使用冻结 fallback;cycle 会被拒绝。
# Events
事件 id 必须是版本化的点分标识,例如 example.greeting.render.v1。主机拥有 payload validator、NOTIFY/COLLECT mode、contribution validator 和 failure policy。包只能注册 manifest 已声明的事件。NOTIFY handler 必须返回 null;COLLECT 的结果必须通过主机 validator。执行顺序按 dependency rank、priority、package id、handler id 确定。
# Closed-world 与失败
不要添加“看起来合理”的字段。未知顶层字段、未知 dependency 字段、重复 capability、重复 data namespace、错误版本或错误 package type 都会 fail closed。使用 稳定诊断定位。