For AI agents: the complete documentation index is available at https://scriptedalchemy.github.io/agent-bundle/zh/llms.txt, the full documentation bundle is available at https://scriptedalchemy.github.io/agent-bundle/zh/llms-full.txt, and this page is available as Markdown at https://scriptedalchemy.github.io/agent-bundle/zh/reference/artifact-manifest.md.
跳至主要内容
  • 简体中文
  • 产物清单

    agent-bundle.manifest.json 位于 agent-bundle build 输出的组合插件根目录顶层(根目录布局见 Target 与产物)。它是产物的索引:一份文档记录了被编译的应用身份、编译后的 路由图、被选中的宿主投影及每个投影派生出的宿主文档、根目录能启动的每一个可执行文件,以及根目录如何分发。 每个消费者,install、uninstall、doctor、serve-app、mcp、hooks、eval --artifact、inspect、 Workbench 与 npm prepack 门禁,都只读这一个文件来了解根目录包含什么。它们都不会去探测 .claude-plugin/plugin.json、.mcp.json 或目录布局。

    契约

    属性规则
    只写一次只有 agent-bundle build 在暂存根目录完成之后写出它。没有任何别的东西会创建它;构建之后唯一的编辑是 files[] 一节所述对派生变体的重新索引,它只重新测量非编译行,绝不触碰编译行。
    manifestVersion6。读取方拒绝任何其他值。
    规范字节文件就是该文档的规范 JSON 序列化,对象键已排序、没有无意义的空白、末尾恰有一个换行。每个读取方都会把解析结果重新序列化,字节不完全一致就拒绝该文件。手工编辑、重新格式化或重复键都会让读取失败。
    封闭键每个对象只接受文档化的那些键。任何层级上的未知键都是解析错误。
    有序数组每个数组都有显式的排序键(各分节下方注明),且没有重复项。
    精简读取方上面各行描述的是完整解析器(parseArtifactManifest),下表中的消费者除一个之外都使用它:打包进生成 bin 的 <plugin> web 支持不经解析器读取清单。它只校验自己启动所需的切片并忽略其余所有键,但对这些切片是拒绝而非过滤,所用检查与完整解析器相同(由 web-host/manifest.ts 持有,两者都从它导入):6 以外的 manifestVersion 或重复的 JSON 键;不是对象、未命名 host 或重复 host 的 projections[] 行;不是对象、kind 未知、按 kind 不应携带却带有 launch 记录(或应携带却缺失)、或重复 server name 的 executables.mcpServers[] 行,同名两行绝不会解析为后者;格式错误的 launch 记录,或其 entry 不是其服务器 kind 所启动的那种 files[] 行(compiled 对应 bundle,prebuilt 对应 prebuilt)、worker 不是 bundle 行、或 artifact 参数不在根目录之内的记录(参数可以指向根目录下含有行的目录);以及 server 并非带 launch 记录之行的 web.apps[] 行。
    路径每个路径都是 POSIX 形式、相对根目录且安全:没有前导 /、没有反斜杠、没有 . 或 .. 段,也绝不会是构建机上的绝对路径。把整个组合根目录搬到另一个绝对路径后,每个读取方仍然可用:所有路径都保持相对根目录,并在搬迁后的树内解析。任何分节指向的路径,宿主文档、可执行文件、App 视图、安装文件,同时也是一行 files[]。

    由谁写入

    agent-bundle build,别无他者。文档中的一切都是派生的:作者声明 agent-bundle.config.ts(元数据、 targets、钩子、MCP 服务器、脚本、市场)与约定文件系统(src/mcp/**、src/cli/**、src/hooks/**、 src/events/**、src/scripts/**),构建则从规范化模型、编译后的路由图、组合计划以及它输出的文件写出清单。 Amp 的 index.js 入口,以及 Claude、Codex、Cursor 与 portable 的插件清单、市场、MCP 与钩子文档,和清单在同一次 构建中由同一个编译模型序列化而成。每份宿主文档都是带摘要固定的 files[] 行,因此手工编辑会使产物摘要校验 失败。文件中没有任何可手工编辑的内容:修改配置或源码,然后重新构建。

    由谁读取

    消费者读取什么
    install <host> --from <root>、uninstall<root> 下的清单。身份来自 application;市场名来自 projections[host].marketplace;宿主文件来自 documents.plugin,Amp 工厂来自 documents.entry。Amp 只安装该 entry 所在目录;其他宿主使用清单拥有的根。缺少清单、投影、所需宿主文件或摘要不符时以 AB7001 拒绝。
    doctor --from <root>与 install 相同的身份、固定路径文件集合与内容哈希读取,按被检查的宿主逐一进行;它对树运行的静态校验(AB7319)继续按投影进行。在已安装的根目录上,doctor 与 uninstall 通过安装时复制的清单,即 projections[host].documents.mcp 指向的宿主 MCP 文档,定位声明的 AGENT_BUNDLE_STATE_ROOT 覆盖,绝不探测宿主文档路径;没有清单的根目录不声明文档覆盖,转而回退到继承的 AGENT_BUNDLE_STATE_ROOT,再回退到推导出的状态根。
    serve-app、mcp list / invoke / run从 executables.mcpServers[] 取服务器编译后的 launch 记录及其 apps[];省略 --target 时从 projections[] 选出宿主。
    hooks list / simulateexecutables.hooks[],可被模拟的编译器 wrapper。
    inspect --json当产物输出位置存在已构建的清单时,追加一份 output.manifest 摘要,投影与可执行文件,因此 JSON 消费者无需第二次探测。inspect --artifact <root> 通过该文件读取裸的复合根,并打印 Workbench 渲染的同一份 application 投影,包括 distribution.payloads[] 行。
    eval --artifact、agent-bundle/test 的已安装宿主证明用 projections[] 与 executables.hooks[] 取代任何宿主文档。
    Workbench 产物页通过 ArtifactInspection.application 上的 application-explorer 投影读取清单:应用身份、宿主及其文档、合并后的服务器路由与可执行信息、事件与钩子、CLI、脚本和分发信息。输出文件树仍是独立的检查证据;浏览器不会把清单原始形状用作应用树模型。
    validate --artifact、build整份文档:存在性与规范字节(AB6000、AB6001)、files[] 与树的比对(AB6004),以及基于 executables.hooks[] 的钩子一致性(AB6018)。
    prepackfiles[]、projections[] 与 compiler.project.packageVersion,用于打包清点(AB7010–AB7013)。

    公开契约

    顶层有九个必填键,application、compiler、distribution、executables、files、 manifestVersion、projections、routes、runtime,外加可选的 web,恰在配置向 <plugin> web 暴露了 App 时出现。安装、诊断、服务或列出根目录的消费者 (install、doctor、serve-app、mcp、hooks、inspect 摘要)只读这份契约。编译器运行事实 在 compiler 下,并单独版本化。

    runtime、manifestVersion

    字段内容
    manifestVersion6。为消费者读取的公开契约版本化。
    runtime{ node },该根目录据以构建的面向消费者的生成式可执行文件运行时下限,为满足框架下限的规范 major.minor.patch 字符串。

    application

    应用身份,只记录一次且与宿主无关。它是 install、doctor 与 uninstall 作用的对象;宿主插件清单与 这一行在同一次构建中由同一个编译模型序列化而成。

    字段必填内容
    id是规范化插件的 metadata.id。
    name是插件名。
    version是插件版本。
    description否配置了的话,即 metadata.description。

    files[]

    除清单自身外的每个输出文件,按 path 排序。每行的源输入出处在 compiler.provenance,不在这里。

    字段必填内容
    path是相对根目录的路径,且每个路径段都可移植:没有控制字符,也没有 Windows 保留的字符(尖括号、冒号、双引号、竖线、问号、星号),不是 Windows 设备名(CON、NUL、COM1……),结尾没有点或空格,安装器回执中的路径遵守同一规则,因此解析器接受的清单,每个安装器都能复制并拥有。绝不会是 agent-bundle.manifest.json,也绝不会位于工件不拥有的根条目之上或之下(任何大小写):运行时的 state/(因此 payload 不能命名为 state,AB4741)与安装器的 .agent-bundle-install.json 回执。安装器既不复制也不拥有这些条目,因此对已索引行的复制总能重新测量出与清单一致的清点。
    bytes是字节大小。
    sha256是内容摘要。校验比对的是真实字节,因此被手工改过的生成文件会失败。
    kind是bundle(编译后的入口)、copy(逐字节复制)、generated(编译器写出的文档)或 prebuilt(预构建 payload 文件)。
    mode否构建设置了文件模式时的取值,0 至 0o777。

    install 与 doctor --from 把这些行用作权威产物清点。它们直接读取每个列出的路径, 按 sha256 校验字节,并在不枚举根目录的情况下将其计入回执内容哈希。清单文件自身以及 操作员放在旁边的 .env 或 .env.local 也会被复制并哈希;未列出的文件会被忽略。 当工具从已构建根目录派生变体(例如 Workbench 开发安装)时,它会重新索引该变体的清单, 因为这份清单仍是安装器复制和哈希的清点依据。重新索引只会重新测量、添加或移除非编译行 (被改写的宿主 MCP 文档、安装标记)。bundle 行与 agent-bundle.compile-evidence.json 会被拒绝: 证据记录描述的是编译器产出的编译字节,只有重新构建才会产生新的记录,而校验器会让证据描述了 其他字节的工件失败(AB6039)。

    projections[]

    每个所选宿主一行,按 host 排序。target 选择投影;它们不是身份。

    字段必填内容
    host是项目选择该投影时所用的目标名:amp、claude、codex、cursor、portable,或已注册适配器的名字。名字是选择,不是身份。
    builtInHost由内置适配器规划时规划该投影的内置适配器身份:amp、claude、codex、cursor 或 portable。高级注册表的适配器缺省此字段,即使它注册在内置名字下。安装与产物消费者都按此字段选取内置宿主投影,而不是按 host。
    documents是指向该投影输出的宿主文档的根相对指针;每个存在的指针都是一行 files[]。见下文。
    marketplace否{ name },该投影的市场文档所注册的市场。只与 documents.marketplace 同时出现。

    documents 有五个可选键,每个键只在投影输出了对应文件时出现:

    键内容
    entry没有 JSON 清单的宿主可执行插件入口。Amp 在此记录 .amp/plugins/<name>/index.js。
    plugin宿主插件清单(.claude-plugin/plugin.json、.codex-plugin/plugin.json、.cursor-plugin/plugin.json 或 portable 的 plugin.json)。宿主既没有它也没有必需的 entry 时以 AB7001 拒绝。
    marketplace市场文档(.claude-plugin/marketplace.json、.agents/plugins/marketplace.json、.cursor-plugin/marketplace.json)。
    mcp宿主 MCP 文档(.mcp.json、.codex-plugin/mcp.json、.cursor-plugin/mcp.json、mcp.json)。
    hooks宿主钩子文档(hooks/hooks.json、.codex-plugin/hooks.json、.cursor-plugin/hooks.json)。

    routes

    产物据以构建的编译后路由图,应用 IR,与宿主无关。它与 Workbench 路由目录展示的是同一次编译器遍历的 同一份投影;只是缺少 Workbench 仅用于展示的字段。

    字段必填内容
    digest是对路由图项目相对身份的 SHA-256。
    servers[]是每个 MCP 服务器一行,按 id 排序:{ id, name, mode, routes[] }。id 为 mcp:<name>;mode 为 generated、custom、command、remote 或 conflict;routes[] 是该服务器的路由,每条的 serverId 等于服务器的 id。
    events[]是event-route 路由,按 id 排序。
    scripts[]是script 路由,按 id 排序。
    cli否{ mode, routes[], commands? }:mode 为 generated、conventional 或 conflict;routes[] 是 cli 路由,加上 routes.mcpCommands 投射进可执行文件的每个 MCP tool 路由;commands[] 恰在 generated 模式下出现,且每个命令的 routeId 指向其中一条路由。
    providers[]是{ id, name, source },按 id 排序;id 为 provider:<stem>。
    layouts[]是{ id, scope, serverId?, source },按 id 排序:layout:root 带 scope: 'root',或 layout:mcp:<server> 带 scope: 'server' 且 serverId 指向已声明的服务器。
    contracts[]恰在有路由绑定契约时规范输入契约(#593),按 id 排序:{ id, input, origin: { module, binding }, routes[] }。id 为 contract:<module>#<binding>;input 是所有绑定路由共享的有界 JSON Schema;origin 是声明它的模块(相对项目根)与绑定名;routes[] 是绑定该契约的路由 id(已排序)。

    每条路由行的形状相同:

    字段必填内容
    id是路由 id:tool:<server>/<stem>、prompt:…、resource:…、app:<server>/<name>、event:<event>、cli:<path>、script:<path>。
    kind是app、cli、event-route、prompt、resource、script 或 tool。
    source是路由模块,项目相对的 POSIX 路径,路由的可移植身份。
    provenance是{ kind: 'conventional' }。今天唯一的来源是文件系统发现;这个判别字段是将来投影路由挂接的位置。
    event恰对 event-route规范事件,例如 tool/after。
    execution仅 event-route{ fallback, handler?, runtime }。handler 指向编译器内部的轻量处理器或门禁模块;runtime 选择 shared 或 standalone 渲染。provider 在请求中按需解析。
    serverId恰对 MCP 类型所属服务器 mcp:<name>,出现在 app、prompt、resource 与 tool 路由上。
    description否config.description,当它是非空白字符串时。
    inputSchema否路由输入的有界 JSON Schema 投影:一个 additionalProperties: false 的对象,属性类型为 boolean、number、string(可带 enum)或由它们组成的 array,每个属性可带 default 与 description,外加可选的 required 列表。来自 config.inputJsonSchema;未声明元数据时缺省。
    contract否该路由所绑定 input 所在的 routes.contracts[] 行;未提取到静态契约时缺省。

    routes.cli.commands[] 的一行,按拼接后的 path 排序:

    字段必填内容
    routeId是该命令运行的 cli: 路由。
    path[]是命令段,至少一个。
    aliases[]是已排序的别名。
    input否独立命令接受 --input JSON 时为 "json"。工具投影使用 projection.input。
    options[]是路由输入 schema 的 argv 投影,按 key 排序:{ key, option, kind, repeated, required, aliases?, choices?, description?, positional? },kind 为 boolean、enum、number、string 之一;aliases 是 CLI 投影额外声明的、已排序的 --拼写。
    exitCode是result 或 zero。
    mcp否当该命令是某个 MCP 工具的 CLI 投影时为 { server, tool, confirm }。
    projection否当该命令由某个工具的 <tool>.cli.{ts,tsx} 模块编译而来时为 { module, mapInput, input?, defaults?, relaxed? }:module 是项目相对的模块路径,mapInput 表示它是否导出映射函数,input 为 "json" 表示命令通过 --input 以一个 JSON 对象接收工具的规范输入而非逐字段 flag(此时 mapInput 为 false,且没有 defaults/relaxed),defaults 是仅限 CLI 的 flags.<key>.default 字面量(键已排序),relaxed 是在 CLI 上被放宽为可选的规范必填键(已排序)。
    description否命令描述。

    executables

    产物能启动的每一个进程,以及它的 Flight worker(如果有)。每个 hosts[] 列表与每个 host 都指向一行 projections[]。

    字段内容
    bins[]路由式 CLI 可执行文件,按 name 排序:{ name, path, worker?, hosts[] }。path 为 bin/<name>.mjs;hosts[] 是携带 CLI bin 的所选投影。
    hooks[]每个宿主的每个编译器钩子 wrapper 一行,先按 host 再按 id 排序:{ id, name, event, host, kind, path, routeId?, timeout? }。kind 为 event-route(分派 src/events/** 路由的 wrapper)或 config(配置中声明的钩子);routeId 指向 event-route wrapper 所分派的 routes.events[] 行,且仅在该 kind 下出现;event 是钩子事件(afterTool、sessionStart……);timeout 是以秒计的原生钩子超时。作者直接写进宿主钩子文档的原生命令与预构建 payload 命令不是行。
    mcpServers[]每个触达所选宿主的 MCP 服务器一行,按 id 排序:{ id, name, transport, kind, hosts[], launch?, apps[] }。kind 为 compiled(产物从编译后的 entry 启动服务器)、prebuilt(产物从 definePrebuilt payload 中的文件启动)、command(宿主运行配置的命令)或 remote(宿主连接一个 URL);launch 恰对 compiled 与 prebuilt 服务器出现,是每个宿主 MCP 文档所投影、也是 <plugin> web 所启动的唯一启动记录:{ entry, worker?, args[], env }。entry 是根相对的可执行文件(编译产物或 payload 文件),worker 是编译 entry 的 Flight worker(二者都对应一行 files[]);args[] 是作者在 entry 之后声明的参数,按顺序排列,每项为 { kind: 'artifact', path }(根内的根相对路径,一行 files[] 或 payload 目录下的路径,由锚定在 agent-bundle:path:plugin-root/ 上的参数写出)或 { kind: 'literal', value }(其余所有参数,与声明完全一致;只是看起来像路径的参数仍是 literal);env 是声明的静态环境。args[] literal 与 env 值中的 agent-bundle:path:* 令牌由启动器展开,清单本身从不展开。apps[] 按 id 排序:编译后的 MCP App 视图为 { id, name, resourceUri, path? }(path 是其自包含 HTML),由预构建 payload 提供的 App 为 { id, name, resourceUri, prebuilt: true }。
    scripts[]每个输出脚本一行,按 id 排序:{ id, name, path, worker?, mode, hosts[], rendered? }。mode 为 bundle 或 copy;rendered: { routeId } 指向渲染式脚本所渲染的 routes.scripts[] 路由。

    distribution

    字段必填内容
    channels[]是始终有 local;恰当 compiler.project.packageName 存在时有 npm。已排序。
    install否指向安装表面的根相对指针:{ instructions?: 'INSTALL.md', script?: 'install.mjs' },根目录至少携带其一时出现。
    payloads[]是每个为所选宿主打包的预构建负载目录(definePrebuilt)一行:{ hosts, name, runtimeDependencies }。name 是产物根下的目录名;hosts 是它所打包的投影;runtimeDependencies 是作者声明的、已排序去重的裸包名列表,即该目录树在运行时加载的包,编译器从不打开负载文件,因此这是唯一的记录。产物专用消费者读取的就是这一行(install、doctor、#555 S4 的 npm 根),这些包必须存在于消费者运行时,产物从不打包它们。按 name 排序。

    web

    唯一的可选根键。恰当配置中的 web 暴露了至少一个 targets 与所选投影相交的 App 时出现;<plugin> web、agent-bundle dev 的 /web/<server>/<app> 与 doctor 读取它,绝不会从 src/** 重新发现 App。

    字段必填内容
    open是browser 或 never:宿主开始监听后 <plugin> web 是否打开默认浏览器。
    apps[]是按 app 排序且唯一。每行包含 app(<server>/<name>)、name、server、resourceUri、allow[](预先批准的 App 发起的同意能力),以及打开调用可选的 tool 与 input。该行不携带任何启动字段:server 指向一行 kind 为 compiled 或 prebuilt 的 executables.mcpServers[],启动来自该行的 launch 记录。

    编译器记录(compiler,recordVersion)

    编译器运行的操作记录。由 recordVersion 独立于 manifestVersion 版本化:这里的变更不是消费者读取的产物契约变更。该对象恰有七个键,全部必填:adapters、agentSkills、producer、project、provenance、recordVersion、validation。

    字段内容
    recordVersion1。编译器记录的封闭形状变更时递增;不递增 manifestVersion。
    producer{ name: 'agent-bundle', version },写出该根目录的框架版本。name 始终为 agent-bundle。
    project产物据以编译的项目。见下文。
    provenance[]每个 files[] 行一条,按 path 排序:{ path, sourceInputs[] }。路径集合等于 files[] 的路径集合。
    adapters[]每个投影一行,按 host 排序:{ host, adapterRevision, observedVersion, schemas[] }。宿主集合等于 projections[].host 集合。
    agentSkills{ specification, sourceRevision, schemaSha256 },Skill 文档据以校验的 Agent Skills 规范固定值。
    validation{ artifact: { status }, source: { status }, projections: [{ host, status }] }。每个 status 都是 passed,校验失败的根目录永远不会被写出,且 projections[] 恰好按同一顺序列出 projections[] 中的宿主。

    compiler.project

    字段必填内容
    configPath是相对项目根目录的配置文件。它必须出现在 sourceInputs 中,且哈希等于 configDigest。
    configDigest是配置文件的 SHA-256。
    modelDigest是规范化模型的 SHA-256;项目路径按相对项目根目录的形式参与哈希,因此摘要不随检出路径变化。
    revision是对 sourceInputs 的摘要;读取方会重新计算并拒绝不匹配。
    sourceInputs[]是构建读取的每个项目输入:{ path, sha256, executable? },按 path 排序。
    packageName否经校验的 npm 包名;未打包的开发项目中不存在。
    packageVersion否经校验的发布版本;未打包的开发项目中不存在。

    compiler.adapters[]

    字段必填内容
    host是指向匹配的 projections[] 行。
    adapterRevision是适配器由仓库维护的单调递增修订。
    observedVersion是记录其能力证据时观察到的宿主版本。
    schemas[]是该投影据以校验的固定宿主文档 schema:{ name, revision, sha256 },按 name 排序。

    compiler.provenance[]

    字段必填内容
    path是匹配的 files[] 路径。绝不会是 agent-bundle.manifest.json。
    sourceInputs[]是该文件派生自的 compiler.project.sourceInputs 路径,已排序。

    跨分节规则

    读取方在接受文档之前会强制这些规则:

    • compiler.project.configPath 是一条 compiler.project.sourceInputs 记录,其哈希为 compiler.project.configDigest,且 compiler.project.revision 是 compiler.project.sourceInputs 的摘要。
    • compiler.provenance 的路径等于 files[] 的路径,且每条出处的 sourceInputs 路径都是 compiler.project.sourceInputs 路径。
    • compiler.adapters 的宿主等于 projections[] 的宿主。
    • 每个指针,projections[].documents.*、executables.*[].path 与 worker、 executables.mcpServers[].launch.entry 与 .worker、executables.mcpServers[].apps[].path、 distribution.install.*,都指向一行 files[]。
    • executables.mcpServers[].launch 恰在 kind 为 compiled 或 prebuilt 时出现;每个 kind 为 artifact 的 launch.args[] 项都指向一行 files[] 或根下的一个目录。
    • 每个 web.apps[].server 都指向一行携带 launch 的 executables.mcpServers[]。
    • 每个 hosts[] 项与每个 hooks[].host 都指向一行 projections[]。
    • 每个 distribution.payloads[].name 目录下至少有一行 kind 为 prebuilt 的 files[]。
    • compiler.validation.projections[] 的宿主等于 projections[] 的宿主。
    • executables.scripts[].rendered.routeId 指向一条 routes.scripts[] 路由。
    • distribution.channels 恰当 compiler.project.packageName 存在时包含 npm。

    一份精简示例

    一个只为 claude 构建的根目录,来自带有一个生成式 MCP 服务器、一个 MCP App、一个事件路由与一个路由式 CLI 的插件。摘要已省略;键按规范(排序后的)顺序出现。

    {
      "application": { "id": "hauler", "name": "cargo-hauler", "version": "1.4.2" },
      "compiler": {
        "adapters": [
          { "adapterRevision": "…", "host": "claude", "observedVersion": "2.1.260",
            "schemas": [{ "name": "plugin", "revision": "…", "sha256": "…" }] }
        ],
        "agentSkills": { "schemaSha256": "…", "sourceRevision": "…", "specification": "…" },
        "producer": { "name": "agent-bundle", "version": "0.9.0" },
        "project": {
          "configDigest": "…", "configPath": "agent-bundle.config.ts", "modelDigest": "…",
          "packageName": "cargo-hauler", "packageVersion": "1.4.2", "revision": "…",
          "sourceInputs": [{ "path": "agent-bundle.config.ts", "sha256": "…" }]
        },
        "provenance": [
          { "path": ".claude-plugin/plugin.json", "sourceInputs": ["agent-bundle.config.ts"] }
        ],
        "recordVersion": 1,
        "validation": {
          "artifact": { "status": "passed" },
          "projections": [{ "host": "claude", "status": "passed" }],
          "source": { "status": "passed" }
        }
      },
      "distribution": {
        "channels": ["local", "npm"],
        "install": { "instructions": "INSTALL.md" },
        "payloads": []
      },
      "executables": {
        "bins": [
          { "hosts": ["claude"], "name": "cargo-hauler", "path": "bin/cargo-hauler.mjs",
            "worker": "bin/cargo-hauler-flight.mjs" }
        ],
        "hooks": [
          { "event": "afterTool", "host": "claude", "id": "hook:event-route:tool-after",
            "kind": "event-route", "name": "event-route-tool-after",
            "path": "hooks/event-route-tool-after-….mjs",
            "routeId": "event:tool/after" }
        ],
        "mcpServers": [
          { "apps": [
              { "id": "mcp-app:hauler:dashboard", "name": "dashboard",
                "path": "mcp-apps/dashboard.html", "resourceUri": "ui://hauler/dashboard" }
            ],
            "hosts": ["claude"], "id": "mcp:hauler", "kind": "compiled",
            "launch": {
              "args": [
                { "kind": "literal", "value": "--config" },
                { "kind": "artifact", "path": "config/hauler.json" }
              ],
              "entry": "mcp/mcp-hauler-….mjs",
              "env": { "HAULER_CACHE": "agent-bundle:path:plugin-data/cache" },
              "worker": "mcp/mcp-hauler-…-flight.mjs" },
            "name": "hauler", "transport": "stdio" }
        ],
        "scripts": []
      },
      "files": [
        { "bytes": 412, "kind": "generated", "path": ".claude-plugin/plugin.json",
          "sha256": "…" }
      ],
      "manifestVersion": 6,
      "projections": [
        { "builtInHost": "claude",
          "documents": { "hooks": "hooks/hooks.json", "marketplace": ".claude-plugin/marketplace.json",
            "mcp": ".mcp.json", "plugin": ".claude-plugin/plugin.json" },
          "host": "claude", "marketplace": { "name": "cargo-hauler-marketplace" } }
      ],
      "routes": {
        "cli": {
          "commands": [
            { "aliases": [], "exitCode": "result", "options": [], "path": ["status"],
              "routeId": "cli:status" }
          ],
          "mode": "generated",
          "routes": [
            { "id": "cli:status", "kind": "cli", "provenance": { "kind": "conventional" },
              "source": "src/cli/status.tsx" }
          ]
        },
        "digest": "…",
        "events": [
          { "event": "tool/after", "id": "event:tool/after", "kind": "event-route",
            "execution": { "fallback": "none", "runtime": "shared" },
            "provenance": { "kind": "conventional" }, "source": "src/events/tool/after.tsx" }
        ],
        "layouts": [], "providers": [], "scripts": [],
        "servers": [
          { "id": "mcp:hauler", "mode": "generated", "name": "hauler",
            "routes": [
              { "id": "tool:hauler/status", "kind": "tool", "provenance": { "kind": "conventional" },
                "serverId": "mcp:hauler", "source": "src/mcp/hauler/status.tsx" }
            ] }
        ]
      },
      "runtime": { "node": "22.12.0" }
    }

    Schema 与编程访问

    该契约以 JSON Schema(draft 2020-12,每一层都是 additionalProperties: false)随包发布在 agent-bundle/schemas/agent-bundle.manifest.schema.json,agent-bundle 入口点把它导出为 artifactManifestSchema,旁边是 validateArtifactManifestSchema。TypeScript 类型、严格解析器与 schema 互相测试,因此其中一个接受的文档另外两个也接受。

    同一入口点导出读取方:

    导出用途
    readArtifactManifest(root)打开 <root>/agent-bundle.manifest.json,返回 { status: 'ok', manifest, path, root }、{ status: 'missing', … } 或 { status: 'invalid', detail, … }。这是框架自身的消费者打开已构建根目录的唯一方式。
    parseArtifactManifest(bytes)把规范字节解析并校验为冻结的 ArtifactManifest;任何违规,包括重复键或非规范字节,都会抛出。
    artifactManifestName'agent-bundle.manifest.json'。
    artifactManifestVersion6。
    artifactCompilerRecordVersion1。

    类型(ArtifactManifest、ArtifactManifestCompiler、ArtifactManifestCompilerAdapter、 ArtifactManifestProvenance、ArtifactManifestProjection、ArtifactManifestExecutables……)见生成的 类型 API。

    保留键

    这些键属于设计的一部分,但不会输出,v6 读取方会像对待任何未知键一样拒绝它们。在此列出,是为了让消费者 不要自创拼写:

    保留键预期内容
    projections[].componentsinspect 打印的逐宿主组件清点(selected / skipped 及原因)。
    executables.noticeDelivery烘焙进每个编译后 wrapper 与 MCP 入口的通知投递交集。
    executables.mcpServers[].apps[].clientApp 的生成式客户端与 web 环境。

    版本规则

    版本 6 将事件 execution.preflight 改名为 execution.handler,并移除旧 execution.providers 选择字段。

    每个根目录携带两个版本号。键在每一层都是封闭的,因此可选并不等于向后兼容:版本 N 的读取方会拒绝 任何它不认识的键或枚举值(精简的 web 读取方在读取任何切片之前就先拒绝版本不匹配)。

    • manifestVersion 为消费者读取的公开契约版本化(application、files[]、runtime、 projections[]、routes、executables、distribution)。旧的封闭读取方会拒绝的任何变更 都会使其递增,新增、重命名或删除一个公开契约键(无论是否可选),或更改读取方封闭的枚举值集合。 同一版本内键清单冻结。读取方拒绝任何其他 manifestVersion。版本 5 新增 routes.cli.commands[].projection.input("json")。版本 4 新增 projections[].documents.entry 与 amp 内置宿主。版本 3 标记 npm 根目录保留清单所拥有的 字节与可执行文件这一规范保证;版本 2 已预留同样的 distribution.install 指针形状。版本 2 把 targets[] 重命名为 projections[],把过去由 agent-bundle.hooks.json 承载的钩子行移入 executables.hooks[] 并删除了 该文件,并新增了 application、routes、executables、distribution 与 projections[].documents。
    • compiler.recordVersion 按同样规则为编译器记录的键版本化(producer、project、 provenance[]、adapters[]、agentSkills、validation)。只改这些事实的内部编译器重构会递增 recordVersion,而不会迫使 manifestVersion 递增。读取方拒绝任何其他 recordVersion。当前值为 1。

    请用 manifestVersion 与文档一致的框架版本读取产物;无论哪个方向的不一致都意味着重新构建,而不是回退。

    诊断

    代码含义
    AB6000清单缺失,或根目录不是可读目录。
    AB6001清单不是严格的规范清单,或在校验运行期间发生了变化。
    AB6004某行 files[] 与树不一致。
    AB6018executables.hooks[] 与某份宿主钩子文档就编译器 wrapper 不一致。
    AB7001install、uninstall 或 doctor 无法从 --from 下的清单解析出该宿主,或某个列出的文件缺失,或在大小、摘要、安装后的可执行状态上与其 files[] 行不符。声明的包 bin 必须保持可执行;清单未声明为可执行的文件必须保持不可执行。install 会在把 npm 安装的产物复制到宿主前恢复清单模式。

    全部说明见诊断参考。

    下一步