plugins: rename marketplace to plugin hub
Alessandro committed
Mar 16, 2026 at 17:54 UTC
2dc6bd54f28c51930fc7982f1a41bcb69c01dc79
26 files changed
+106
-106
docs/README.md
+1
-1
@@ -70,7 +70,7 @@ Welcome to the Agent Zero documentation hub. Whether you're getting started or d
70
- [User Guides](#user-guides)
71
- [Usage Guide](guides/usage.md)
72
- [Basic Operations](guides/usage.md#basic-operations)
73
- - [Plugins and Marketplace](guides/usage.md#plugins-and-marketplace)
73
+ - [Plugins and Plugin Hub](guides/usage.md#plugins-and-plugin-hub)
74
- [Tool Usage](guides/usage.md#tool-usage)
75
- [Projects](guides/usage.md#projects)
76
- [What Projects Provide](guides/usage.md#what-projects-provide)
docs/agents/AGENTS.plugins.md
+3
-3
@@ -302,14 +302,14 @@ Index submission rules:
302
- `tags`: optional, up to 5, use recommended tags from https://github.com/agent0ai/a0-plugins/blob/main/TAGS.md
303
- `screenshots`: optional, up to 5 full image URLs (png/jpg/webp, each ≤ 2 MB)
304
305
-### Plugin Marketplace
305
+### Plugin Hub
306
307
-The marketplace is provided by the always-enabled `_plugin_installer` plugin. Users can reach it from the **Plugins** dialog in two ways:
307
+The Plugin Hub is provided by the always-enabled `_plugin_installer` plugin. Users can reach it from the **Plugins** dialog in two ways:
308
309
- the **Browse** tab in `webui/components/plugins/list/plugin-list.html`
310
- the **Install** toolbar action injected by `plugins/_plugin_installer/extensions/webui/plugins-list-header-buttons/install-buttons.html`, which opens `plugins/_plugin_installer/webui/main.html` on its own **Browse** tab
311
312
-Both routes surface Plugin Index entries inside Agent Zero. The marketplace supports search, filtering, sorting, and a detail view with README content and installation actions.
312
+Both routes surface Plugin Index entries inside Agent Zero. The Plugin Hub supports search, filtering, sorting, and a detail view with README content and installation actions.
313
314
---
315
docs/developer/contributing-skills.md
+3
-3
@@ -318,13 +318,13 @@ One skill = one expertise area. If your skill is getting too long, split it:
318
- Title: `feat(skills): add my-skill-name skill`
319
- Description: Explain what the skill does and why it's useful
320
321
-### Publishing to Skills Marketplace
321
+### Publishing Skills
322
323
-Share your skills on [skillsmp.com](https://skillsmp.com):
323
+Share your skills on [skillsmp.com](https://skillsmp.com) or [skills.sh](https://skills.sh):
324
325
1. Create a GitHub repository for your skill
326
2. Ensure it follows the SKILL.md standard
327
-3. Submit to the marketplace via their contribution process
327
+3. Submit via their contribution process
328
329
### Creating a Skills Collection
330
docs/developer/plugins.md
+4
-4
@@ -287,16 +287,16 @@ Submission rules:
287
- `tags`: optional, up to 5, see https://github.com/agent0ai/a0-plugins/blob/main/TAGS.md
288
- `screenshots`: optional, up to 5 full image URLs (png/jpg/webp, each ≤ 2 MB)
289
290
-### Plugin Marketplace
290
+### Plugin Hub
291
292
-Agent Zero now exposes the community **Plugin Marketplace** through the always-enabled **Plugin Installer** plugin. Users can browse Plugin Index entries directly from the Plugins UI without leaving the application.
292
+Agent Zero now exposes the community **Plugin Hub** through the always-enabled **Plugin Installer** plugin. Users can browse Plugin Index entries directly from the Plugins UI without leaving the application.
293
294
-Users can open the marketplace from the **Plugins** dialog in two ways:
294
+Users can open the Plugin Hub from the **Plugins** dialog in two ways:
295
296
- click the **Browse** tab after **Custom** and **Builtin**
297
- click **Install** in the plugin list toolbar to open the installer modal, which starts on its own **Browse** tab
298
299
-The marketplace supports search, filtering, sorting, and a plugin detail view with README content and the install action.
299
+The Plugin Hub supports search, filtering, sorting, and a plugin detail view with README content and the install action.
300
301
## User Feedback in Plugin UI (Notifications)
302
docs/guides/usage.md
+7
-7
@@ -74,24 +74,24 @@ Access the chat history in JSON format
74
> [!TIP]
75
> Use the Context and History buttons to understand how the agent interprets your instructions and debug any unexpected behavior.
76
77
-### Plugins and Marketplace
77
+### Plugins and Plugin Hub
78
Open the **Plugins** dialog from the sidebar quick actions by clicking the plugin icon.
79
80

81
82
From this view you can manage installed plugins, review plugin details, open plugin settings, and change activation state.
83
84
-#### Open the Plugin Marketplace
85
-There are two ways to reach the marketplace from the Plugins dialog:
84
+#### Open the Plugin Hub
85
+There are two ways to reach the Plugin Hub from the Plugins dialog:
86
87
-1. Click the **Browse** tab after **Custom** and **Builtin** to switch the current dialog into marketplace mode.
87
+1. Click the **Browse** tab after **Custom** and **Builtin** to switch the current dialog into the Plugin Hub view.
88
2. Click the **Install** button in the top-right toolbar to open the installer modal, which starts on its own **Browse** tab.
89
90
-
90
+
91
92
-The marketplace lets you search community plugins, filter by tags, sort the listing, and open a plugin card for more context before installing.
92
+The Plugin Hub lets you search community plugins, filter by tags, sort the listing, and open a plugin card for more context before installing.
93
94
-
94
+
95
96
Opening a plugin shows its author, tags, README content, and install action. Once you are in the detail view, the next steps are intentionally straightforward.
97
docs/res/usage/plugins/marketplace-main-view.png
Binary files a/docs/res/usage/plugins/marketplace-main-view.png and /dev/null differ
docs/res/usage/plugins/plugin-hub-main-view.png
Binary files /dev/null and b/docs/res/usage/plugins/plugin-hub-main-view.png differ
docs/res/usage/plugins/plugin-hub-plugin-detail.png
renamed
docs/res/usage/plugins/plugins-list-01.png
Binary files /dev/null and b/docs/res/usage/plugins/plugins-list-01.png differ
docs/res/usage/plugins/plugins-list.png
Binary files a/docs/res/usage/plugins/plugins-list.png and /dev/null differ
plugins/README.md
+3
-3
@@ -85,8 +85,8 @@ Optional additional fields: `screenshots` (up to 5 image URLs).
85
86
Note: The index `index.yaml` is a **different file with a different schema** from the runtime `plugin.yaml`. Folder names use `^[a-z0-9_]+$` (underscores, no hyphens) and must match the `name` field in the remote `plugin.yaml` exactly.
87
88
-## Plugin Marketplace
88
+## Plugin Hub
89
90
-Agent Zero now includes a built-in marketplace flow through the always-enabled **Plugin Installer** plugin. From the **Plugins** dialog, users can either open the **Browse** tab or click **Install**, which opens the installer modal on its own **Browse** tab.
90
+Agent Zero now includes a built-in Plugin Hub flow through the always-enabled **Plugin Installer** plugin. From the **Plugins** dialog, users can either open the **Browse** tab or click **Install**, which opens the installer modal on its own **Browse** tab.
91
92
-The marketplace surfaces Plugin Index entries directly in the UI and lets users search, filter, inspect, and install community plugins without leaving Agent Zero.
92
+The Plugin Hub surfaces Plugin Index entries directly in the UI and lets users search, filter, inspect, and install community plugins without leaving Agent Zero.
plugins/_plugin_installer/api/plugin_install.py
+2
-2
@@ -4,7 +4,7 @@ from helpers.api import ApiHandler, Input, Output, Request
4
from werkzeug.datastructures import FileStorage
5
6
from plugins._plugin_installer.helpers.install import (
7
- get_marketplace_index,
7
+ get_plugin_hub_index,
8
install_from_git,
9
install_uploaded_zip,
10
update_from_git,
@@ -55,4 +55,4 @@ class PluginInstall(ApiHandler):
55
return update_from_git(input.get("plugin_name", ""))
56
57
def _fetch_index(self, input: dict) -> dict:
58
- return {"success": True, **get_marketplace_index()}
58
+ return {"success": True, **get_plugin_hub_index()}
plugins/_plugin_installer/extensions/webui/plugins-list-dropdown-end/marketplace-button.html
deleted
-11
@@ -1,11 +0,0 @@
1
-<div x-data>
2
- <template x-if="$store.pluginInstallStore && plugin.marketplace?.key">
3
- <button type="button"
4
- class="dropdown-item"
5
- title="Open in Marketplace"
6
- @click="$store.pluginInstallStore.openMarketplaceDetailByKey(plugin.marketplace.key); actionsOpen = false">
7
- <span class="material-symbols-outlined">storefront</span>
8
- <span>Marketplace</span>
9
- </button>
10
- </template>
11
-</div>
plugins/_plugin_installer/extensions/webui/plugins-list-dropdown-end/plugin-hub-button.html
new
+11
@@ -0,0 +1,11 @@
1
+<div x-data>
2
+ <template x-if="$store.pluginInstallStore && plugin.pluginHub?.key">
3
+ <button type="button"
4
+ class="dropdown-item"
5
+ title="Open in Plugin Hub"
6
+ @click="$store.pluginInstallStore.openPluginHubDetailByKey(plugin.pluginHub.key); actionsOpen = false">
7
+ <span class="material-symbols-outlined">storefront</span>
8
+ <span>Plugin Hub</span>
9
+ </button>
10
+ </template>
11
+</div>
plugins/_plugin_installer/extensions/webui/plugins_list_after_load/annotate-plugin-hub-links.js
renamed
+10
-10
@@ -4,19 +4,19 @@ function getPluginName(plugin) {
4
return typeof plugin?.name === "string" ? plugin.name.trim() : "";
5
}
6
7
-function getMarketplaceMatch(plugin, marketplacePlugins) {
7
+function getPluginHubMatch(plugin, pluginHubPlugins) {
8
const pluginName = getPluginName(plugin);
9
- if (!pluginName || !marketplacePlugins?.[pluginName]) {
9
+ if (!pluginName || !pluginHubPlugins?.[pluginName]) {
10
return null;
11
}
12
13
return {
14
key: pluginName,
15
- title: marketplacePlugins[pluginName]?.title || pluginName,
15
+ title: pluginHubPlugins[pluginName]?.title || pluginName,
16
};
17
}
18
19
-export default async function annotateMarketplaceLinks(context) {
19
+export default async function annotatePluginHubLinks(context) {
20
const plugins = Array.isArray(context?.plugins) ? context.plugins : null;
21
const store = context?.store;
22
if (!plugins?.length) return;
@@ -24,19 +24,19 @@ export default async function annotateMarketplaceLinks(context) {
24
const loaded = await pluginInstallStore.ensureIndexLoaded({ background: true });
25
if (!loaded) return;
26
27
- const marketplacePlugins = pluginInstallStore.index?.plugins;
28
- if (!marketplacePlugins || typeof marketplacePlugins !== "object") return;
27
+ const pluginHubPlugins = pluginInstallStore.index?.plugins;
28
+ if (!pluginHubPlugins || typeof pluginHubPlugins !== "object") return;
29
30
let changed = false;
31
for (const plugin of plugins) {
32
if (!plugin || typeof plugin !== "object") continue;
33
34
- const nextMarketplace = getMarketplaceMatch(plugin, marketplacePlugins);
35
- const currentKey = plugin?.marketplace?.key || "";
36
- const nextKey = nextMarketplace?.key || "";
34
+ const nextPluginHub = getPluginHubMatch(plugin, pluginHubPlugins);
35
+ const currentKey = plugin?.pluginHub?.key || "";
36
+ const nextKey = nextPluginHub?.key || "";
37
if (currentKey === nextKey) continue;
38
39
- plugin.marketplace = nextMarketplace;
39
+ plugin.pluginHub = nextPluginHub;
40
changed = true;
41
}
42
plugins/_plugin_installer/helpers/install.py
+2
-2
@@ -243,8 +243,8 @@ def run_install_hook(plugin_name: str):
243
return plugins.call_plugin_hook(plugin_name, "install")
244
245
246
-def get_marketplace_index() -> dict[str, Any]:
247
- """Return the plugin index plus installed marketplace keys."""
246
+def get_plugin_hub_index() -> dict[str, Any]:
247
+ """Return the plugin index plus installed Plugin Hub keys."""
248
index_data = fetch_plugin_index()
249
if not isinstance(index_data, dict):
250
raise ValueError("Plugin index response was not a JSON object")
plugins/_plugin_installer/webui/install-detail.html
+9
-9
@@ -186,7 +186,7 @@
186
</div>
187
188
<div class="pi-version-section"
189
- x-show="$store.pluginInstallStore.getCurrentInstalledVersion() || $store.pluginInstallStore.getCurrentInstalledCommit() || $store.pluginInstallStore.getLatestMarketplaceVersion() || $store.pluginInstallStore.getLatestMarketplaceCommit()">
189
+ x-show="$store.pluginInstallStore.getCurrentInstalledVersion() || $store.pluginInstallStore.getCurrentInstalledCommit() || $store.pluginInstallStore.getLatestPluginHubVersion() || $store.pluginInstallStore.getLatestPluginHubCommit()">
190
<div class="pi-version-header">Version</div>
191
<div class="pi-version-grid">
192
<div class="pi-version-card"
@@ -209,23 +209,23 @@
209
x-text="$store.pluginInstallStore.formatUserLocaleDateTime($store.pluginInstallStore.getCurrentInstalledCommitTimestamp()) || 'Timestamp unavailable'"></div>
210
</div>
211
<div class="pi-version-card"
212
- x-show="$store.pluginInstallStore.getLatestMarketplaceVersion() || $store.pluginInstallStore.getLatestMarketplaceCommit()">
212
+ x-show="$store.pluginInstallStore.getLatestPluginHubVersion() || $store.pluginInstallStore.getLatestPluginHubCommit()">
213
<div class="pi-version-label">Latest</div>
214
<div class="pi-version-name"
215
- x-text="$store.pluginInstallStore.getLatestMarketplaceVersion() || 'Unknown version'"></div>
216
- <template x-if="$store.pluginInstallStore.getLatestMarketplaceCommit() && $store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestMarketplaceCommit())">
215
+ x-text="$store.pluginInstallStore.getLatestPluginHubVersion() || 'Unknown version'"></div>
216
+ <template x-if="$store.pluginInstallStore.getLatestPluginHubCommit() && $store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestPluginHubCommit())">
217
<a class="pi-version-commit"
218
- :href="$store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestMarketplaceCommit())"
218
+ :href="$store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestPluginHubCommit())"
219
target="_blank"
220
rel="noopener noreferrer"
221
- x-text="$store.pluginInstallStore.getCommitShortHash($store.pluginInstallStore.getLatestMarketplaceCommit())"></a>
221
+ x-text="$store.pluginInstallStore.getCommitShortHash($store.pluginInstallStore.getLatestPluginHubCommit())"></a>
222
</template>
223
- <template x-if="!($store.pluginInstallStore.getLatestMarketplaceCommit() && $store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestMarketplaceCommit()))">
223
+ <template x-if="!($store.pluginInstallStore.getLatestPluginHubCommit() && $store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestPluginHubCommit()))">
224
<div class="pi-version-commit"
225
- x-text="$store.pluginInstallStore.getCommitShortHash($store.pluginInstallStore.getLatestMarketplaceCommit()) || 'Unknown'"></div>
225
+ x-text="$store.pluginInstallStore.getCommitShortHash($store.pluginInstallStore.getLatestPluginHubCommit()) || 'Unknown'"></div>
226
</template>
227
<div class="pi-version-time"
228
- x-text="$store.pluginInstallStore.formatUserLocaleDateTime($store.pluginInstallStore.getLatestMarketplaceCommitTimestamp()) || 'Timestamp unavailable'"></div>
228
+ x-text="$store.pluginInstallStore.formatUserLocaleDateTime($store.pluginInstallStore.getLatestPluginHubCommitTimestamp()) || 'Timestamp unavailable'"></div>
229
</div>
230
</div>
231
</div>
plugins/_plugin_installer/webui/install-index.html
+3
-3
@@ -13,7 +13,7 @@
13
14
<section class="pi-browse-hero">
15
<div class="pi-browse-copy">
16
- <div class="pi-browse-eyebrow">Community Marketplace</div>
16
+ <div class="pi-browse-eyebrow">Community Plugin Hub</div>
17
<h2 class="pi-browse-title">Discover community plugins for Agent Zero</h2>
18
<p class="pi-browse-description">
19
These plugins are provided by the community of Agent Zero. Contribute by publishing in the <a href="https://github.com/agent0ai/a0-plugins" target="_blank">index repository</a>.
@@ -60,7 +60,7 @@
60
<div x-show="$store.pluginInstallStore.loading" class="pi-state-card pi-state-loading">
61
<span class="material-symbols-outlined">progress_activity</span>
62
<div>
63
- <div class="pi-state-title">Loading marketplace</div>
63
+ <div class="pi-state-title">Loading Plugin Hub</div>
64
<div class="pi-state-text" x-text="$store.pluginInstallStore.loadingMessage || 'Loading plugins...'"></div>
65
</div>
66
</div>
@@ -124,7 +124,7 @@
124
<div>
125
<div class="pi-state-title">No plugins match this view</div>
126
<div class="pi-state-text">
127
- Try a different search or switch to another marketplace filter.
127
+ Try a different search or switch to another Plugin Hub filter.
128
</div>
129
</div>
130
</div>
plugins/_plugin_installer/webui/pluginInstallStore.js
+14
-14
@@ -115,7 +115,7 @@ const model = {
115
return aTime > bTime ? 1 : -1;
116
},
117
118
- _hasMarketplaceUpdate(indexPlugin, installedPlugin) {
118
+ _hasPluginHubUpdate(indexPlugin, installedPlugin) {
119
const latestCommit = (indexPlugin?.commit || "").trim();
120
const currentCommit = (installedPlugin?.current_commit || "").trim();
121
if (!latestCommit || !currentCommit) return false;
@@ -322,7 +322,7 @@ const model = {
322
...plugin,
323
current_commit: installedPlugin?.current_commit || "",
324
current_commit_timestamp: installedPlugin?.current_commit_timestamp || "",
325
- has_update: this._hasMarketplaceUpdate(plugin, installedPlugin),
325
+ has_update: this._hasPluginHubUpdate(plugin, installedPlugin),
326
};
327
});
328
},
@@ -424,23 +424,23 @@ const model = {
424
this.page = Math.max(1, Math.min(p, this.totalPages));
425
},
426
427
- getMarketplacePluginByKey(pluginKey) {
427
+ getPluginHubPluginByKey(pluginKey) {
428
const key = typeof pluginKey === "string" ? pluginKey.trim() : "";
429
if (!key) return null;
430
return this.pluginsList.find((plugin) => plugin.key === key) || null;
431
},
432
433
- async openMarketplaceDetailByKey(pluginKey) {
433
+ async openPluginHubDetailByKey(pluginKey) {
434
const key = typeof pluginKey === "string" ? pluginKey.trim() : "";
435
if (!key) return false;
436
437
const loaded = await this.ensureIndexLoaded();
438
if (!loaded) return false;
439
440
- const plugin = this.getMarketplacePluginByKey(key);
440
+ const plugin = this.getPluginHubPluginByKey(key);
441
if (!plugin) {
442
void toastFrontendError(
443
- `Plugin "${key}" is not available in the marketplace index`,
443
+ `Plugin "${key}" is not available in the Plugin Hub index`,
444
"Plugin Installer"
445
);
446
return false;
@@ -502,7 +502,7 @@ const model = {
502
const confirmed = await showConfirmDialog({
503
...SECURITY_WARNING,
504
extensionContext: {
505
- kind: "marketplace_plugin_install_warning",
505
+ kind: "plugin_hub_plugin_install_warning",
506
source: "plugin_installer",
507
pluginKey: plugin.key || "",
508
pluginTitle: plugin.title || plugin.key || "",
@@ -566,7 +566,7 @@ const model = {
566
installed: true,
567
current_commit: latestInstalled?.["current_commit"] || indexPlugin["current_commit"] || "",
568
current_commit_timestamp: latestInstalled?.["current_commit_timestamp"] || indexPlugin["current_commit_timestamp"] || "",
569
- has_update: this._hasMarketplaceUpdate(indexPlugin, latestInstalled),
569
+ has_update: this._hasPluginHubUpdate(indexPlugin, latestInstalled),
570
};
571
this.detailThumbnailUrl = this.getThumbnailUrl(this.selectedPlugin);
572
},
@@ -684,15 +684,15 @@ const model = {
684
return this.installedPluginInfo?.["current_commit_timestamp"] || this.selectedPlugin?.["current_commit_timestamp"] || "";
685
},
686
687
- getLatestMarketplaceVersion() {
687
+ getLatestPluginHubVersion() {
688
return this.selectedPlugin?.["version"] || "";
689
},
690
691
- getLatestMarketplaceCommit() {
691
+ getLatestPluginHubCommit() {
692
return this.selectedPlugin?.["commit"] || "";
693
},
694
695
- getLatestMarketplaceCommitTimestamp() {
695
+ getLatestPluginHubCommitTimestamp() {
696
return this.selectedPlugin?.["updated"] || "";
697
},
698
@@ -708,7 +708,7 @@ const model = {
708
const confirmed = await showConfirmDialog({
709
...SECURITY_WARNING,
710
extensionContext: {
711
- kind: "marketplace_plugin_install_warning",
711
+ kind: "plugin_hub_plugin_install_warning",
712
source: "plugin_installer",
713
pluginKey,
714
pluginTitle: pluginRecord["title"] || pluginKey,
@@ -800,8 +800,8 @@ const model = {
800
801
/** Refresh related list views after installer/detail actions. */
802
refreshPluginList() {
803
- const marketplaceActive = pluginListStore.activeTab === "marketplace";
804
- if (marketplaceActive) {
803
+ const pluginHubActive = pluginListStore.activeTab === "pluginHub";
804
+ if (pluginHubActive) {
805
void this.fetchIndex();
806
}
807
pluginListStore.refresh();
plugins/_plugin_scan/extensions/webui/confirm_dialog_after_render/add-plugin-hub-scan-action.js
renamed
+4
-4
@@ -4,18 +4,18 @@ const NOTE_CLASS = "confirm-dialog-extension-note";
4
const BUTTON_CLASS = "confirm-dialog-plugin-scan-button";
5
const DIALOG_CLOSE_DELAY_MS = 220;
6
7
-function isMarketplaceInstallWarning(extensionContext) {
7
+function isPluginHubInstallWarning(extensionContext) {
8
return (
9
- extensionContext?.kind === "marketplace_plugin_install_warning"
9
+ extensionContext?.kind === "plugin_hub_plugin_install_warning"
10
&& extensionContext?.source === "plugin_installer"
11
&& typeof extensionContext?.gitUrl === "string"
12
&& extensionContext.gitUrl.trim().length > 0
13
);
14
}
15
16
-export default async function addMarketplaceScanAction(context) {
16
+export default async function addPluginHubScanAction(context) {
17
const extensionContext = context?.extensionContext;
18
- if (!isMarketplaceInstallWarning(extensionContext)) return;
18
+ if (!isPluginHubInstallWarning(extensionContext)) return;
19
20
const bodyElement = context?.bodyElement;
21
const footerElement = context?.footerElement;
skills/a0-contribute-plugin/SKILL.md
+4
-4
@@ -1,14 +1,14 @@
1
---
2
name: a0-contribute-plugin
3
-description: Guide for publishing an Agent Zero plugin to the community Plugin Index (a0-plugins repo). Covers GitHub repo setup, index.yaml creation, CI validation rules, and PR submission. Use when the user wants to share, publish, submit, or contribute a plugin to the marketplace so other Agent Zero users can find and install it.
3
+description: Guide for publishing an Agent Zero plugin to the community Plugin Index (a0-plugins repo). Covers GitHub repo setup, index.yaml creation, CI validation rules, and PR submission. Use when the user wants to share, publish, submit, or contribute a plugin to the Plugin Hub so other Agent Zero users can find and install it.
4
version: 1.0.0
5
-tags: ["plugins", "contribute", "publish", "marketplace", "community", "index", "PR"]
5
+tags: ["plugins", "contribute", "publish", "plugin-hub", "community", "index", "PR"]
6
trigger_patterns:
7
- "contribute plugin"
8
- "publish plugin"
9
- "share plugin"
10
- "submit plugin"
11
- - "plugin marketplace"
11
+ - "contribute to plugin hub"
12
- "plugin index"
13
- "community plugin"
14
- "open source plugin"
@@ -51,7 +51,7 @@ The plugin must live in its **own standalone GitHub repository** with plugin con
51
```text
52
your-plugin-repo/ <- GitHub repository root
53
├── plugin.yaml <- runtime manifest (REQUIRED)
54
-├── README.md <- strongly recommended (shown in marketplace detail view)
54
+├── README.md <- strongly recommended (shown in Plugin Hub detail view)
55
├── LICENSE <- strongly recommended
56
├── default_config.yaml <- optional
57
├── api/
skills/a0-create-plugin/SKILL.md
+2
-2
@@ -373,8 +373,8 @@ For a fully guided contribution flow (including git operations), read `/a0/skill
373
374
---
375
376
-## Plugin Index & Marketplace
376
+## Plugin Index & Plugin Hub
377
378
The **Plugin Index** is the community hub at https://github.com/agent0ai/a0-plugins.
379
380
-Agent Zero now exposes indexed plugins through the built-in **Plugin Marketplace**. Users can open it from the **Plugins** dialog either through the **Browse** tab or through the **Install** button, then inspect plugin details and install directly from the UI.
380
+Agent Zero now exposes indexed plugins through the built-in **Plugin Hub**. Users can open it from the **Plugins** dialog either through the **Browse** tab or through the **Install** button, then inspect plugin details and install directly from the UI.
skills/a0-manage-plugin/SKILL.md
+11
-11
@@ -1,8 +1,8 @@
1
---
2
name: a0-manage-plugin
3
-description: Manage Agent Zero plugins lifecycle: browse the marketplace, scan for security, install from Git/ZIP/marketplace, update, uninstall, enable, disable, debug, and troubleshoot. Use when asked to install, update, uninstall, remove, scan, find, search, enable, disable, debug, or troubleshoot a plugin.
3
+description: Manage Agent Zero plugins lifecycle: browse the Plugin Hub, scan for security, install from Git/ZIP/Plugin Hub, update, uninstall, enable, disable, debug, and troubleshoot. Use when asked to install, update, uninstall, remove, scan, find, search, enable, disable, debug, or troubleshoot a plugin.
4
version: 1.2.0
5
-tags: ["plugins", "install", "uninstall", "update", "scan", "security", "debug", "troubleshoot", "marketplace", "manage"]
5
+tags: ["plugins", "install", "uninstall", "update", "scan", "security", "debug", "troubleshoot", "plugin-hub", "manage"]
6
trigger_patterns:
7
- "install plugin"
8
- "uninstall plugin"
@@ -17,7 +17,7 @@ trigger_patterns:
17
- "plugin not working"
18
- "enable plugin"
19
- "disable plugin"
20
- - "plugin marketplace"
20
+ - "plugin hub"
21
- "list plugins"
22
---
23
@@ -29,7 +29,7 @@ Identify what the user needs and jump to the relevant section:
29
30
| User need | Section |
31
|---|---|
32
-| Find / search / browse available plugins | [Browse Marketplace](#browse-marketplace) |
32
+| Find / search / browse available plugins | [Browse Plugin Hub](#browse-plugin-hub) |
33
| Scan a plugin for security issues | [Security Scan](#security-scan) |
34
| Install a plugin | [Install a Plugin](#install-a-plugin) |
35
| Update an installed plugin | [Update a Plugin](#update-a-plugin) |
@@ -40,7 +40,7 @@ Identify what the user needs and jump to the relevant section:
40
41
---
42
43
-## Browse Marketplace
43
+## Browse Plugin Hub
44
45
Fetch the current community index:
46
@@ -63,7 +63,7 @@ Each entry in `plugins` is keyed by plugin name with fields: `title`, `descripti
63
ls /a0/usr/plugins/
64
```
65
66
-**Alternatively via UI**: Open the Plugins dialog in Agent Zero and switch to the **Browse** tab (or click **Install** in the toolbar to open the marketplace).
66
+**Alternatively via UI**: Open the Plugins dialog in Agent Zero and switch to the **Browse** tab (or click **Install** in the toolbar to open the Plugin Hub).
67
68
---
69
@@ -125,10 +125,10 @@ If the scan times out or errors (500), inform the user and ask whether to procee
125
126
### How installed state works
127
128
-The marketplace marks a plugin as **Installed** by cross-referencing marketplace keys against `usr/plugins/` directory names at request time. To appear installed:
128
+The Plugin Hub marks a plugin as **Installed** by cross-referencing Plugin Hub keys against `usr/plugins/` directory names at request time. To appear installed:
129
- The plugin directory must exist at `usr/plugins/<name>/` with a valid `plugin.yaml`
130
- The framework plugin cache must be cleared (the API handles this automatically)
131
-- Re-fetching the marketplace index will then show it as installed
131
+- Re-fetching the Plugin Hub index will then show it as installed
132
133
### API authentication (required for all HTTP calls)
134
@@ -182,15 +182,15 @@ resp = s.post(
182
print(resp.json())
183
```
184
185
-This runs the full pipeline in the framework runtime: clone → validate → place in `usr/plugins/` → run `install` hook → clear plugin cache → notify frontend. The marketplace will show the plugin as installed on the next index fetch.
185
+This runs the full pipeline in the framework runtime: clone → validate → place in `usr/plugins/` → run `install` hook → clear plugin cache → notify frontend. The Plugin Hub will show the plugin as installed on the next index fetch.
186
187
-### Method 2: From the Marketplace (UI) - preferred for interactive use
187
+### Method 2: From the Plugin Hub (UI) - preferred for interactive use
188
189
1. Open the Plugins dialog
190
2. Go to the **Browse** tab (or click **Install**)
191
3. Find the plugin, click it, click **Install**
192
193
-The UI handles everything including marking the plugin as installed in the marketplace view.
193
+The UI handles everything including marking the plugin as installed in the Plugin Hub view.
194
195
### Method 3: From a ZIP file (via HTTP API)
196
skills/a0-plugin-router/SKILL.md
+3
-3
@@ -1,8 +1,8 @@
1
---
2
name: a0-plugin-router
3
-description: Main entry point for all Agent Zero plugin tasks. Routes to specialist skills for creating, reviewing, contributing, managing, or debugging plugins. Use when the user mentions plugins, asks how the plugin system works, wants to build/install/uninstall/publish/debug a plugin, or asks about the Plugin Marketplace.
3
+description: Main entry point for all Agent Zero plugin tasks. Routes to specialist skills for creating, reviewing, contributing, managing, or debugging plugins. Use when the user mentions plugins, asks how the plugin system works, wants to build/install/uninstall/publish/debug a plugin, or asks about the Plugin Hub.
4
version: 1.0.0
5
-tags: ["plugins", "router", "meta", "create", "review", "contribute", "manage", "marketplace"]
5
+tags: ["plugins", "router", "meta", "create", "review", "contribute", "manage", "plugin-hub"]
6
trigger_patterns:
7
- "plugin"
8
- "create plugin"
@@ -12,7 +12,7 @@ trigger_patterns:
12
- "publish plugin"
13
- "install plugin"
14
- "manage plugin"
15
- - "marketplace"
15
+ - "plugin hub"
16
- "plugin index"
17
- "how does the plugin system work"
18
---
webui/components/plugins/list/plugin-list.html
+7
-7
@@ -38,19 +38,19 @@
38
</li>
39
<li class="nav-item" role="presentation">
40
<button class="nav-link"
41
- :class="{ active: $store.pluginListStore.activeTab === 'marketplace' }"
42
- id="plugins-marketplace-tab"
41
+ :class="{ active: $store.pluginListStore.activeTab === 'pluginHub' }"
42
+ id="plugins-plugin-hub-tab"
43
type="button"
44
role="tab"
45
- aria-controls="plugins-marketplace"
46
- :aria-selected="$store.pluginListStore.activeTab === 'marketplace'"
47
- @click="$store.pluginListStore.setTab('marketplace')">
45
+ aria-controls="plugins-plugin-hub"
46
+ :aria-selected="$store.pluginListStore.activeTab === 'pluginHub'"
47
+ @click="$store.pluginListStore.setTab('pluginHub')">
48
<span class="material-symbols-outlined pi-tab-icon">store</span> Browse
49
</button>
50
</li>
51
</ul>
52
53
- <template x-if="$store.pluginListStore.activeTab !== 'marketplace'">
53
+ <template x-if="$store.pluginListStore.activeTab !== 'pluginHub'">
54
<div>
55
<div class="plugins-toolbar">
56
<div class="plugins-toolbar-search">
@@ -200,7 +200,7 @@
200
</div>
201
</template>
202
203
- <template x-if="$store.pluginListStore.activeTab === 'marketplace'">
203
+ <template x-if="$store.pluginListStore.activeTab === 'pluginHub'">
204
<x-component path="/plugins/_plugin_installer/webui/install-index.html"></x-component>
205
</template>
206
</div>
webui/components/plugins/list/pluginListStore.js
+3
-3
@@ -45,8 +45,8 @@ const model = {
45
},
46
47
async setTab(tab) {
48
- if (tab === "marketplace") {
49
- this.activeTab = "marketplace";
48
+ if (tab === "pluginHub") {
49
+ this.activeTab = "pluginHub";
50
this.loading = false;
51
return;
52
}
@@ -60,7 +60,7 @@ const model = {
60
},
61
62
async refresh() {
63
- if (this.activeTab === "marketplace") {
63
+ if (this.activeTab === "pluginHub") {
64
return;
65
}
66
await this.setTab(this.activeTab);