将 Agent Zero 插件发布到社区 Plugin Index:从仓库准备到 PR 合入的完整贡献指南
【免费下载链接】agent-zeroAgent Zero AI framework项目地址: https://gitcode.com/GitHub_Trending/ag/agent-zero
导读
本文以 Agent Zero 仓库内插件贡献技能(skills/a0-contribute-plugin/SKILL.md)为核心,系统讲解把一个在本地可用的插件发布到社区 Plugin Index(a0-plugins 社区索引仓库)的完整流程,让所有 Agent Zero 用户都能通过内置 Plugin Hub 发现并安装它。读完本文,你将掌握:独立插件仓库的目录规范与运行期plugin.yaml要求、索引提交index.yaml的编写规则、PR 前镜像 CI 的预校验清单,以及plugin.yaml与index.yaml两套清单的本质区别,并结合仓库源码理解插件发现、校验与生命周期机制。
一、插件贡献的整体背景:Plugin Index 与 Plugin Hub
Agent Zero 采用插件机制扩展能力:仓库根目录plugins/内置框架级系统插件,用户自研插件则位于usr/plugins/(见 plugins/README.md)。当本地插件想要被整个社区使用,就需要提交到社区维护的Plugin Index(a0-plugins 索引仓库):这是一个面向所有 Agent Zero 用户的插件注册表,提交后插件即被纳入索引,可被其他用户发现与安装。
在 Agent Zero 内部,内置的 Plugin Installer 插件提供了Plugin Hub界面:用户从 Plugins 对话框的 Browse 标签页或 Install 按钮进入,即可搜索、筛选、查看并直接安装社区索引中的插件,全程无需离开 Agent Zero(见 plugins/README.md 与 plugins/AGENTS.md)。因此,社区插件贡献的本质就是向这个索引提交一条条目,使插件出现在 Plugin Hub 的浏览列表中。
围绕这一目标,仓库中的a0-contribute-plugin技能(skills/a0-contribute-plugin/AGENTS.md 为技能 DOX 文档,SKILL.md为实际的操作规程)拥有完整的工作流所有权,并保持与 Plugin Hub 及 a0-plugins 仓库当前要求的对齐。整个贡献链路可拆解为六个步骤:确认前置条件 → 确认自动化偏好 → 准备插件 GitHub 仓库 → 确定索引目录名 → 创建索引提交 → 预校验并提交 PR。
二、开始之前:前置条件与自动化偏好确认
2.1 前置条件检查
正式动手前,需要确认以下三项:
- 插件已存在且在本地可运行:插件应位于
usr/plugins/<name>/(usr/目录被 gitignore,是用户插件的唯一合法位置)。这一点与插件架构约定一致——plugins/AGENTS.md 明确指出usr/plugins/之外、plugins/之下是框架保留区域,社区贡献者不应在其中放置自定义插件。 - 插件已完成审查:如果尚未审查,应先运行
a0-review-plugin技能做全面审计。技能建议主动询问用户:"我建议在贡献前先做一次完整审查,现在需要我来做吗?" - 用户具备 GitHub 账号,且本机装有
git/ghCLI:后续的 fork、分支、commit、PR 全部依赖这两个工具。
2.2 Step 0:询问自动化偏好
在开展任何 git 操作之前,先询问用户:
"你希望我自动处理 git 操作(fork、分支、commit、PR),还是希望我给出每一步命令由你手动执行?"
- 自动模式:通过代码执行工具直接运行
gh与git命令; - 手动模式:在每一步向用户提供可直接复制的确切命令。
这一步是技能的关键"人机分工"设计:它把 git 操作的执行权明确交给用户决定,避免在未获授权时擅自操作外部仓库。
三、Step 1:准备独立的插件 GitHub 仓库
3.1 仓库结构与目录规范
社区插件必须位于独立的 GitHub 仓库中,且插件内容必须位于仓库根目录(不能嵌套在子文件夹内):
your-plugin-repo/ <- GitHub 仓库根目录 ├── plugin.yaml <- 运行期清单(必需) ├── README.md <- 强烈推荐(显示在 Plugin Hub 详情页) ├── LICENSE <- 提交 Plugin Index 所必需(放在仓库根目录) ├── default_config.yaml <- 可选 ├── api/ <- API 处理器 ├── tools/ <- 智能体工具 ├── helpers/ <- 共享 Python 逻辑 ├── prompts/ <- 提示词模板 ├── agents/ <- 智能体配置(agent profiles) ├── conf/ <- 配置文件(如 model_providers.yaml) ├── extensions/ <- 生命周期、UI 与隐式 @extensible 钩子 └── webui/ <- 前端页面、store、组件其中extensions/目录的布局必须遵循当前运行时约定(与 plugins/AGENTS.md 记录的插件架构契约一致):
python/<point>/:命名生命周期钩子;python/_functions/<module>/<qualname>/<start|end>/:隐式@extensible钩子;webui/<point>/:UI 断点扩展。
不要使用已废弃的扁平化形式python/<module>_<qualname>_<start|end>/。这一点在源码契约中有明确对应:plugins/AGENTS.md 规定_functions扩展布局必须保留每个模块和嵌套 qualname 段,废弃的扁平化扩展目录名不再被解析。
3.2 运行期plugin.yaml的要求
远端仓库的plugin.yaml是运行期清单,驱动 Agent Zero 的插件行为。提交到 Plugin Index 时,它必须包含name字段——CI 会校验该字段,且必须与索引目录名完全一致:
name: my_plugin # 必需 - 必须与索引目录名一致(^[a-z0-9_]+$) title: My Plugin description: What this plugin does. version: 1.0.0 settings_sections: [] per_project_config: false per_agent_config: false always_enabled: false这些字段与仓库中helpers/plugins.py的PluginMetadata模型一一对应(helpers/plugins.py):name、title、description、version、settings_sections、per_project_config、per_agent_config、always_enabled。其中settings_sections的合法取值为agent、external、mcp、developer、backup,决定插件在 Settings 的哪些标签页显示配置小节;always_enabled: true仅限框架核心插件使用,社区插件应保持false(详见 skills/a0-create-plugin/SKILL.md)。
3.3 创建仓库并推送(自动模式)
若插件是本地构建的,技能会帮助用户创建 GitHub 仓库并推送:
# 创建仓库(自动模式 - 使用 gh CLI) gh repo create <repo-name> --public --description "Agent Zero plugin: <title>" git init git add . git commit -m "feat: initial plugin commit" git remote add origin https://github.com/<user>/<repo-name>.git git push -u origin main推送前建议核对:仓库必须公开(Plugin Index 的github字段指向公开仓库)、插件内容在根目录、README.md与LICENSE齐备。
四、Step 2:确定索引目录名
索引中的目录名必须满足:
- 与远端
plugin.yaml的name字段完全一致; - 符合
^[a-z0-9_]+$(小写字母、数字、下划线,不允许连字符); - 在索引中唯一;
- 不能以
_开头(该前缀保留给框架内部使用,与 plugins/AGENTS.md 中"内置插件目录名与清单name必须以_开头以避免与社区插件冲突"的约定互为镜像)。
在确定名称前,可通过下载当前索引的生成产物来验证唯一性(检查plugins键下是否已存在同名条目):
https://github.com/agent0ai/a0-plugins/releases/download/generated-index/index.json此index.json是 CI 生成的索引产物,也是后续重复检测的事实来源——skills/a0-review-plugin/SKILL.md 的重复检测阶段同样基于该文件判断"插件name是否已存在、是否已有条目指向同一githubURL"。
五、Step 3:创建索引提交(fork + index.yaml)
5.1 Fork 与分支
# 自动模式 gh repo fork https://github.com/agent0ai/a0-plugins --clone --remote cd a0-plugins git checkout -b add-<plugin_name>5.2 创建插件目录与index.yaml
mkdir -p plugins/<plugin_name>需要再次强调:索引使用index.yaml(而不是plugin.yaml)。这是两套完全不同的 schema:
title: My Plugin description: One-sentence description of what the plugin does for the user. github: https://github.com/<user>/<repo-name> tags: - tools - example可选附加字段screenshots(最多 5 个图片 URL,每个 URL 必须可访问):
screenshots: - https://raw.githubusercontent.com/<user>/<repo>/main/docs/screenshot1.png - https://raw.githubusercontent.com/<user>/<repo>/main/docs/screenshot2.webp5.3 推荐标签与可选缩略图
- 标签:从 a0-plugins 仓库的
TAGS.md中选用(最多 5 个)。常用标签包括:tools、automation、workflow、api、web、database、memory、integration、security、development、llm、agents。 - 缩略图(可选):向
plugins/<plugin_name>/目录添加名为thumbnail.png、thumbnail.jpg或thumbnail.webp的正方形图片(最大 20 KB,必须为正方形宽高比)。
这里同样能看到"目录内只允许index.yaml+ 可选缩略图"这一约束在源码层的呼应:index.yaml只承担可发现性描述(title、description、github、tags、screenshots),运行期行为仍由远端仓库根目录的plugin.yaml决定。
六、Step 4:PR 前本地预校验(镜像 CI)
在打开 PR 之前,先在本地运行以下检查——这正是 CI 将要校验的内容(下表完整列出各条规则):
| 检查项 | 规则 |
|---|---|
plugins/<name>/中存在index.yaml | 必需 |
目录中仅有index.yaml+ 可选缩略图 | 不允许其他文件/子目录 |
title长度 | 最多 50 字符 |
description长度 | 最多 500 字符 |
index.yaml总长度 | 最多 2000 字符 |
tags数量 | 最多 5 个 |
screenshots数量 | 最多 5 个,每个 URL 必须可访问 |
githubURL | 指向已存在的公开仓库 |
远端plugin.yaml | 必须存在于仓库根目录 |
远端plugin.yaml的name字段 | 与索引目录名完全一致 |
远端LICENSE | 必须存在于仓库根目录(Plugin Index 政策) |
| 目录名格式 | ^[a-z0-9_]+$,不以_开头 |
githubURL 唯一性 | 索引中不能已有其他插件指向同一 URL |
其中"远端plugin.yaml的name匹配"可通过命令直接验证:
curl -s https://raw.githubusercontent.com/<user>/<repo>/main/plugin.yaml | grep "^name:" # 预期输出: name: <plugin_name>LICENSE这一条值得单独强调:Agent Zero 对本地插件并不强制要求 LICENSE(见 skills/a0-review-plugin/SKILL.md,本地缺失仅 WARN),但提交 Plugin Index 前必须在仓库根目录放置 LICENSE,使用户拥有明确的许可条款——这既是索引政策,也是仓库层面的明确要求(plugins/README.md)。
七、Step 5:提交并打开 PR
# 添加并提交 git add plugins/<plugin_name>/ git commit -m "feat: add <plugin_name> plugin" # 推送并打开 PR git push origin add-<plugin_name> gh pr create \ --repo agent0ai/a0-plugins \ --title "feat: add <plugin_name>" \ --body "## Plugin: <title> <description> - GitHub: <github_url> - Tags: <tags>"PR 规则
- 一个 PR 只提交一个插件(且只新增
plugins/下的一个新目录); - CI 会在打开/同步/重新打开时自动校验;
- CI 通过后由人工维护者审查并合入;
- 若 CI 失败后 PR 超过7 天无任何活动,可能会被自动关闭。
这也解释了 Step 4 预校验的价值:把 CI 会做的检查前置到本地,避免因琐碎错误(如name不匹配、缩略图超 20 KB、目录混入多余文件)导致 PR 进入漫长的失败-等待周期。
八、两套清单,一图看清
| 文件 | 位置 | 用途 | 关键字段 |
|---|---|---|---|
plugin.yaml | 插件 GitHub 仓库根目录 | 运行期清单(驱动 Agent Zero 行为) | name(必需!)、title、description、version、settings_sections、per_project_config、per_agent_config、always_enabled |
index.yaml | a0-plugins/plugins/<name>/ | 索引清单(驱动可发现性) | title、description、github、tags、screenshots |
永远不要混淆这两者。它们的 schema 不同、用途不同。这一区分在 plugins/AGENTS.md 与 plugins/README.md 中被反复强调:"索引index.yaml是与运行期plugin.yaml完全不同的文件、不同的 schema"。
从源码角度印证:运行期清单的字段由helpers/plugins.py的PluginMetadata直接解析(helpers/plugins.py),用于插件的加载、启用状态、配置界面渲染与always_enabled强制开关;而index.yaml是纯描述性条目,只服务于 Plugin Hub 的浏览与发现。
九、源码视角:插件发现、校验与生命周期机制
9.1 插件如何被发现与加载
helpers/plugins.py定义了插件体系的底层机制,理解它有助于把握贡献规范背后的原因:
- 插件根目录:
get_plugin_roots()按优先级返回usr/plugins/<name>与plugins/<name>(helpers/plugins.py),用户插件优先; - 发现规则:
get_plugins_list()遍历根目录,以是否存在plugin.yaml为发现依据(helpers/plugins.py)——这正解释了为什么社区插件仓库根目录必须放置plugin.yaml,缺失即无法被发现; - 启用状态:
get_enabled_plugins()通过.toggle-1/.toggle-0文件与always_enabled字段决定插件是否激活(helpers/plugins.py),插件默认开启,除非在usr/目录被显式禁用。
9.2 钩子与生命周期
插件根目录的hooks.py由call_plugin_hook()按名称调用(helpers/plugins.py),当前内置用法包括:插件安装器在将插件放入usr/plugins/后调用install()、更新器在拉取新代码前调用pre_update()、卸载器在删除插件目录前调用uninstall()(详见 skills/a0-create-plugin/SKILL.md)。贡献者需要注意hooks.py运行在框架运行时,若需要为目标运行时安装依赖,必须在子进程中显式指定解释器(如/opt/venv/bin/python),不能直接sys.executable -m pip install。
9.3 提交前的自动校验支撑
仓库内置的_plugin_validator插件(plugins/_plugin_validator/)提供了清单、结构、约定与安全性的校验能力,其 API 处理与校验清单位于 plugins/_plugin_validator/api/ 与 plugins/_plugin_validator/webui/plugin-validator-checks.json。结合 skills/a0-review-plugin/SKILL.md 的四阶段审计(清单校验 → 结构校验 → 代码模式审查 → 安全与索引审查),可以在贡献前对插件做完整体检,把"社区就绪"(READY)作为提交的前提。
十、贡献前质量保障:与审查、创建技能的协作闭环
社区插件贡献不应是"写完就发",仓库将其设计为一条完整的技能协作链路:
- 创建:a0-create-plugin 负责插件的构建,明确区分本地插件与社区插件两条路径,并在创建时就强调社区插件的仓库结构要求(内容在仓库根目录、
name字段匹配索引目录名); - 审查:a0-review-plugin 提供四阶段完整审计,最终给出 READY / NEEDS WORK / OPTIONAL IMPROVEMENTS 结论——注意对于 Plugin Index 提交,缺失
LICENSE虽标记为 WARN,但会阻塞社区就绪判定; - 贡献:本文所述的 a0-contribute-plugin 负责发布流程,其 DOX 契约(skills/a0-contribute-plugin/AGENTS.md)明确要求:保持仓库、
index.yaml、清单、许可证、校验与 PR 指导的同步更新,不硬编码用户凭据、个人仓库名或私有 URL,并确保与审查、管理技能的交接准确。
对贡献者而言,这条闭环的意义在于:审查阶段发现的问题(如清单字段缺失、Store Gate 模式违规、内联错误提示框、硬编码密钥、路径穿越风险等)应在提交索引前解决,避免污染社区索引并拖长 PR 周期。
十一、相关资源
- 完整贡献操作规程:skills/a0-contribute-plugin/SKILL.md
- 技能维护契约(DOX):skills/a0-contribute-plugin/AGENTS.md
- 插件架构契约(内置与自定义插件、manifest、扩展点、banners、Plugin Index 规则):plugins/AGENTS.md
- 插件生命周期开发指南:docs/developer/plugins.md
- 插件构建技能(本地与社区插件两条路径):skills/a0-create-plugin/SKILL.md
- 插件审查技能(四阶段审计与社区就绪评估):skills/a0-review-plugin/SKILL.md
- 插件发现与加载源码实现:helpers/plugins.py
- 内置校验器插件:plugins/_plugin_validator/
提交时以当前仓库所记录的规范为准:本地插件位于
usr/plugins/<name>/,社区插件内容置于独立公开仓库根目录;索引目录仅含index.yaml与可选缩略图;运行期name与索引目录名严格一致;LICENSE置于仓库根目录;PR 每次仅提交一个插件。遵循这套流程,即可让你的插件出现在 Plugin Hub 中,被所有 Agent Zero 用户发现与安装。
【免费下载链接】agent-zeroAgent Zero AI framework项目地址: https://gitcode.com/GitHub_Trending/ag/agent-zero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考