mirror of
https://github.com/agent0ai/agent-zero.git
synced 2026-04-28 03:30:23 +00:00
plugins: rename marketplace to plugin hub
This commit is contained in:
parent
2a6820064d
commit
2dc6bd54f2
26 changed files with 106 additions and 106 deletions
|
|
@ -70,7 +70,7 @@ Welcome to the Agent Zero documentation hub. Whether you're getting started or d
|
|||
- [User Guides](#user-guides)
|
||||
- [Usage Guide](guides/usage.md)
|
||||
- [Basic Operations](guides/usage.md#basic-operations)
|
||||
- [Plugins and Marketplace](guides/usage.md#plugins-and-marketplace)
|
||||
- [Plugins and Plugin Hub](guides/usage.md#plugins-and-plugin-hub)
|
||||
- [Tool Usage](guides/usage.md#tool-usage)
|
||||
- [Projects](guides/usage.md#projects)
|
||||
- [What Projects Provide](guides/usage.md#what-projects-provide)
|
||||
|
|
|
|||
|
|
@ -302,14 +302,14 @@ Index submission rules:
|
|||
- `tags`: optional, up to 5, use recommended tags from https://github.com/agent0ai/a0-plugins/blob/main/TAGS.md
|
||||
- `screenshots`: optional, up to 5 full image URLs (png/jpg/webp, each ≤ 2 MB)
|
||||
|
||||
### Plugin Marketplace
|
||||
### Plugin Hub
|
||||
|
||||
The marketplace is provided by the always-enabled `_plugin_installer` plugin. Users can reach it from the **Plugins** dialog in two ways:
|
||||
The Plugin Hub is provided by the always-enabled `_plugin_installer` plugin. Users can reach it from the **Plugins** dialog in two ways:
|
||||
|
||||
- the **Browse** tab in `webui/components/plugins/list/plugin-list.html`
|
||||
- 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
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -318,13 +318,13 @@ One skill = one expertise area. If your skill is getting too long, split it:
|
|||
- Title: `feat(skills): add my-skill-name skill`
|
||||
- Description: Explain what the skill does and why it's useful
|
||||
|
||||
### Publishing to Skills Marketplace
|
||||
### Publishing Skills
|
||||
|
||||
Share your skills on [skillsmp.com](https://skillsmp.com):
|
||||
Share your skills on [skillsmp.com](https://skillsmp.com) or [skills.sh](https://skills.sh):
|
||||
|
||||
1. Create a GitHub repository for your skill
|
||||
2. Ensure it follows the SKILL.md standard
|
||||
3. Submit to the marketplace via their contribution process
|
||||
3. Submit via their contribution process
|
||||
|
||||
### Creating a Skills Collection
|
||||
|
||||
|
|
|
|||
|
|
@ -287,16 +287,16 @@ Submission rules:
|
|||
- `tags`: optional, up to 5, see https://github.com/agent0ai/a0-plugins/blob/main/TAGS.md
|
||||
- `screenshots`: optional, up to 5 full image URLs (png/jpg/webp, each ≤ 2 MB)
|
||||
|
||||
### Plugin Marketplace
|
||||
### Plugin Hub
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
Users can open the marketplace from the **Plugins** dialog in two ways:
|
||||
Users can open the Plugin Hub from the **Plugins** dialog in two ways:
|
||||
|
||||
- click the **Browse** tab after **Custom** and **Builtin**
|
||||
- click **Install** in the plugin list toolbar to open the installer modal, which starts on its own **Browse** tab
|
||||
|
||||
The marketplace supports search, filtering, sorting, and a plugin detail view with README content and the install action.
|
||||
The Plugin Hub supports search, filtering, sorting, and a plugin detail view with README content and the install action.
|
||||
|
||||
## User Feedback in Plugin UI (Notifications)
|
||||
|
||||
|
|
|
|||
|
|
@ -74,24 +74,24 @@ Access the chat history in JSON format
|
|||
> [!TIP]
|
||||
> Use the Context and History buttons to understand how the agent interprets your instructions and debug any unexpected behavior.
|
||||
|
||||
### Plugins and Marketplace
|
||||
### Plugins and Plugin Hub
|
||||
Open the **Plugins** dialog from the sidebar quick actions by clicking the plugin icon.
|
||||
|
||||

|
||||
|
||||
From this view you can manage installed plugins, review plugin details, open plugin settings, and change activation state.
|
||||
|
||||
#### Open the Plugin Marketplace
|
||||
There are two ways to reach the marketplace from the Plugins dialog:
|
||||
#### Open the Plugin Hub
|
||||
There are two ways to reach the Plugin Hub from the Plugins dialog:
|
||||
|
||||
1. Click the **Browse** tab after **Custom** and **Builtin** to switch the current dialog into marketplace mode.
|
||||
1. Click the **Browse** tab after **Custom** and **Builtin** to switch the current dialog into the Plugin Hub view.
|
||||
2. Click the **Install** button in the top-right toolbar to open the installer modal, which starts on its own **Browse** tab.
|
||||
|
||||

|
||||

|
||||
|
||||
The marketplace lets you search community plugins, filter by tags, sort the listing, and open a plugin card for more context before installing.
|
||||
The Plugin Hub lets you search community plugins, filter by tags, sort the listing, and open a plugin card for more context before installing.
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 155 KiB |
BIN
docs/res/usage/plugins/plugin-hub-main-view.png
Normal file
BIN
docs/res/usage/plugins/plugin-hub-main-view.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 217 KiB |
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB |
BIN
docs/res/usage/plugins/plugins-list-01.png
Normal file
BIN
docs/res/usage/plugins/plugins-list-01.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 149 KiB |
|
|
@ -85,8 +85,8 @@ Optional additional fields: `screenshots` (up to 5 image URLs).
|
|||
|
||||
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.
|
||||
|
||||
## Plugin Marketplace
|
||||
## Plugin Hub
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
The marketplace surfaces Plugin Index entries directly in the UI and lets users search, filter, inspect, and install community plugins without leaving Agent Zero.
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ from helpers.api import ApiHandler, Input, Output, Request
|
|||
from werkzeug.datastructures import FileStorage
|
||||
|
||||
from plugins._plugin_installer.helpers.install import (
|
||||
get_marketplace_index,
|
||||
get_plugin_hub_index,
|
||||
install_from_git,
|
||||
install_uploaded_zip,
|
||||
update_from_git,
|
||||
|
|
@ -55,4 +55,4 @@ class PluginInstall(ApiHandler):
|
|||
return update_from_git(input.get("plugin_name", ""))
|
||||
|
||||
def _fetch_index(self, input: dict) -> dict:
|
||||
return {"success": True, **get_marketplace_index()}
|
||||
return {"success": True, **get_plugin_hub_index()}
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
<div x-data>
|
||||
<template x-if="$store.pluginInstallStore && plugin.marketplace?.key">
|
||||
<button type="button"
|
||||
class="dropdown-item"
|
||||
title="Open in Marketplace"
|
||||
@click="$store.pluginInstallStore.openMarketplaceDetailByKey(plugin.marketplace.key); actionsOpen = false">
|
||||
<span class="material-symbols-outlined">storefront</span>
|
||||
<span>Marketplace</span>
|
||||
</button>
|
||||
</template>
|
||||
</div>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
<div x-data>
|
||||
<template x-if="$store.pluginInstallStore && plugin.pluginHub?.key">
|
||||
<button type="button"
|
||||
class="dropdown-item"
|
||||
title="Open in Plugin Hub"
|
||||
@click="$store.pluginInstallStore.openPluginHubDetailByKey(plugin.pluginHub.key); actionsOpen = false">
|
||||
<span class="material-symbols-outlined">storefront</span>
|
||||
<span>Plugin Hub</span>
|
||||
</button>
|
||||
</template>
|
||||
</div>
|
||||
|
|
@ -4,19 +4,19 @@ function getPluginName(plugin) {
|
|||
return typeof plugin?.name === "string" ? plugin.name.trim() : "";
|
||||
}
|
||||
|
||||
function getMarketplaceMatch(plugin, marketplacePlugins) {
|
||||
function getPluginHubMatch(plugin, pluginHubPlugins) {
|
||||
const pluginName = getPluginName(plugin);
|
||||
if (!pluginName || !marketplacePlugins?.[pluginName]) {
|
||||
if (!pluginName || !pluginHubPlugins?.[pluginName]) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
key: pluginName,
|
||||
title: marketplacePlugins[pluginName]?.title || pluginName,
|
||||
title: pluginHubPlugins[pluginName]?.title || pluginName,
|
||||
};
|
||||
}
|
||||
|
||||
export default async function annotateMarketplaceLinks(context) {
|
||||
export default async function annotatePluginHubLinks(context) {
|
||||
const plugins = Array.isArray(context?.plugins) ? context.plugins : null;
|
||||
const store = context?.store;
|
||||
if (!plugins?.length) return;
|
||||
|
|
@ -24,19 +24,19 @@ export default async function annotateMarketplaceLinks(context) {
|
|||
const loaded = await pluginInstallStore.ensureIndexLoaded({ background: true });
|
||||
if (!loaded) return;
|
||||
|
||||
const marketplacePlugins = pluginInstallStore.index?.plugins;
|
||||
if (!marketplacePlugins || typeof marketplacePlugins !== "object") return;
|
||||
const pluginHubPlugins = pluginInstallStore.index?.plugins;
|
||||
if (!pluginHubPlugins || typeof pluginHubPlugins !== "object") return;
|
||||
|
||||
let changed = false;
|
||||
for (const plugin of plugins) {
|
||||
if (!plugin || typeof plugin !== "object") continue;
|
||||
|
||||
const nextMarketplace = getMarketplaceMatch(plugin, marketplacePlugins);
|
||||
const currentKey = plugin?.marketplace?.key || "";
|
||||
const nextKey = nextMarketplace?.key || "";
|
||||
const nextPluginHub = getPluginHubMatch(plugin, pluginHubPlugins);
|
||||
const currentKey = plugin?.pluginHub?.key || "";
|
||||
const nextKey = nextPluginHub?.key || "";
|
||||
if (currentKey === nextKey) continue;
|
||||
|
||||
plugin.marketplace = nextMarketplace;
|
||||
plugin.pluginHub = nextPluginHub;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
|
|
@ -243,8 +243,8 @@ def run_install_hook(plugin_name: str):
|
|||
return plugins.call_plugin_hook(plugin_name, "install")
|
||||
|
||||
|
||||
def get_marketplace_index() -> dict[str, Any]:
|
||||
"""Return the plugin index plus installed marketplace keys."""
|
||||
def get_plugin_hub_index() -> dict[str, Any]:
|
||||
"""Return the plugin index plus installed Plugin Hub keys."""
|
||||
index_data = fetch_plugin_index()
|
||||
if not isinstance(index_data, dict):
|
||||
raise ValueError("Plugin index response was not a JSON object")
|
||||
|
|
|
|||
|
|
@ -186,7 +186,7 @@
|
|||
</div>
|
||||
|
||||
<div class="pi-version-section"
|
||||
x-show="$store.pluginInstallStore.getCurrentInstalledVersion() || $store.pluginInstallStore.getCurrentInstalledCommit() || $store.pluginInstallStore.getLatestMarketplaceVersion() || $store.pluginInstallStore.getLatestMarketplaceCommit()">
|
||||
x-show="$store.pluginInstallStore.getCurrentInstalledVersion() || $store.pluginInstallStore.getCurrentInstalledCommit() || $store.pluginInstallStore.getLatestPluginHubVersion() || $store.pluginInstallStore.getLatestPluginHubCommit()">
|
||||
<div class="pi-version-header">Version</div>
|
||||
<div class="pi-version-grid">
|
||||
<div class="pi-version-card"
|
||||
|
|
@ -209,23 +209,23 @@
|
|||
x-text="$store.pluginInstallStore.formatUserLocaleDateTime($store.pluginInstallStore.getCurrentInstalledCommitTimestamp()) || 'Timestamp unavailable'"></div>
|
||||
</div>
|
||||
<div class="pi-version-card"
|
||||
x-show="$store.pluginInstallStore.getLatestMarketplaceVersion() || $store.pluginInstallStore.getLatestMarketplaceCommit()">
|
||||
x-show="$store.pluginInstallStore.getLatestPluginHubVersion() || $store.pluginInstallStore.getLatestPluginHubCommit()">
|
||||
<div class="pi-version-label">Latest</div>
|
||||
<div class="pi-version-name"
|
||||
x-text="$store.pluginInstallStore.getLatestMarketplaceVersion() || 'Unknown version'"></div>
|
||||
<template x-if="$store.pluginInstallStore.getLatestMarketplaceCommit() && $store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestMarketplaceCommit())">
|
||||
x-text="$store.pluginInstallStore.getLatestPluginHubVersion() || 'Unknown version'"></div>
|
||||
<template x-if="$store.pluginInstallStore.getLatestPluginHubCommit() && $store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestPluginHubCommit())">
|
||||
<a class="pi-version-commit"
|
||||
:href="$store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestMarketplaceCommit())"
|
||||
:href="$store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestPluginHubCommit())"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
x-text="$store.pluginInstallStore.getCommitShortHash($store.pluginInstallStore.getLatestMarketplaceCommit())"></a>
|
||||
x-text="$store.pluginInstallStore.getCommitShortHash($store.pluginInstallStore.getLatestPluginHubCommit())"></a>
|
||||
</template>
|
||||
<template x-if="!($store.pluginInstallStore.getLatestMarketplaceCommit() && $store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestMarketplaceCommit()))">
|
||||
<template x-if="!($store.pluginInstallStore.getLatestPluginHubCommit() && $store.pluginInstallStore.getRepoCommitUrl($store.pluginInstallStore.selectedPlugin, $store.pluginInstallStore.getLatestPluginHubCommit()))">
|
||||
<div class="pi-version-commit"
|
||||
x-text="$store.pluginInstallStore.getCommitShortHash($store.pluginInstallStore.getLatestMarketplaceCommit()) || 'Unknown'"></div>
|
||||
x-text="$store.pluginInstallStore.getCommitShortHash($store.pluginInstallStore.getLatestPluginHubCommit()) || 'Unknown'"></div>
|
||||
</template>
|
||||
<div class="pi-version-time"
|
||||
x-text="$store.pluginInstallStore.formatUserLocaleDateTime($store.pluginInstallStore.getLatestMarketplaceCommitTimestamp()) || 'Timestamp unavailable'"></div>
|
||||
x-text="$store.pluginInstallStore.formatUserLocaleDateTime($store.pluginInstallStore.getLatestPluginHubCommitTimestamp()) || 'Timestamp unavailable'"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
<section class="pi-browse-hero">
|
||||
<div class="pi-browse-copy">
|
||||
<div class="pi-browse-eyebrow">Community Marketplace</div>
|
||||
<div class="pi-browse-eyebrow">Community Plugin Hub</div>
|
||||
<h2 class="pi-browse-title">Discover community plugins for Agent Zero</h2>
|
||||
<p class="pi-browse-description">
|
||||
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 @@
|
|||
<div x-show="$store.pluginInstallStore.loading" class="pi-state-card pi-state-loading">
|
||||
<span class="material-symbols-outlined">progress_activity</span>
|
||||
<div>
|
||||
<div class="pi-state-title">Loading marketplace</div>
|
||||
<div class="pi-state-title">Loading Plugin Hub</div>
|
||||
<div class="pi-state-text" x-text="$store.pluginInstallStore.loadingMessage || 'Loading plugins...'"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -124,7 +124,7 @@
|
|||
<div>
|
||||
<div class="pi-state-title">No plugins match this view</div>
|
||||
<div class="pi-state-text">
|
||||
Try a different search or switch to another marketplace filter.
|
||||
Try a different search or switch to another Plugin Hub filter.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ const model = {
|
|||
return aTime > bTime ? 1 : -1;
|
||||
},
|
||||
|
||||
_hasMarketplaceUpdate(indexPlugin, installedPlugin) {
|
||||
_hasPluginHubUpdate(indexPlugin, installedPlugin) {
|
||||
const latestCommit = (indexPlugin?.commit || "").trim();
|
||||
const currentCommit = (installedPlugin?.current_commit || "").trim();
|
||||
if (!latestCommit || !currentCommit) return false;
|
||||
|
|
@ -322,7 +322,7 @@ const model = {
|
|||
...plugin,
|
||||
current_commit: installedPlugin?.current_commit || "",
|
||||
current_commit_timestamp: installedPlugin?.current_commit_timestamp || "",
|
||||
has_update: this._hasMarketplaceUpdate(plugin, installedPlugin),
|
||||
has_update: this._hasPluginHubUpdate(plugin, installedPlugin),
|
||||
};
|
||||
});
|
||||
},
|
||||
|
|
@ -424,23 +424,23 @@ const model = {
|
|||
this.page = Math.max(1, Math.min(p, this.totalPages));
|
||||
},
|
||||
|
||||
getMarketplacePluginByKey(pluginKey) {
|
||||
getPluginHubPluginByKey(pluginKey) {
|
||||
const key = typeof pluginKey === "string" ? pluginKey.trim() : "";
|
||||
if (!key) return null;
|
||||
return this.pluginsList.find((plugin) => plugin.key === key) || null;
|
||||
},
|
||||
|
||||
async openMarketplaceDetailByKey(pluginKey) {
|
||||
async openPluginHubDetailByKey(pluginKey) {
|
||||
const key = typeof pluginKey === "string" ? pluginKey.trim() : "";
|
||||
if (!key) return false;
|
||||
|
||||
const loaded = await this.ensureIndexLoaded();
|
||||
if (!loaded) return false;
|
||||
|
||||
const plugin = this.getMarketplacePluginByKey(key);
|
||||
const plugin = this.getPluginHubPluginByKey(key);
|
||||
if (!plugin) {
|
||||
void toastFrontendError(
|
||||
`Plugin "${key}" is not available in the marketplace index`,
|
||||
`Plugin "${key}" is not available in the Plugin Hub index`,
|
||||
"Plugin Installer"
|
||||
);
|
||||
return false;
|
||||
|
|
@ -502,7 +502,7 @@ const model = {
|
|||
const confirmed = await showConfirmDialog({
|
||||
...SECURITY_WARNING,
|
||||
extensionContext: {
|
||||
kind: "marketplace_plugin_install_warning",
|
||||
kind: "plugin_hub_plugin_install_warning",
|
||||
source: "plugin_installer",
|
||||
pluginKey: plugin.key || "",
|
||||
pluginTitle: plugin.title || plugin.key || "",
|
||||
|
|
@ -566,7 +566,7 @@ const model = {
|
|||
installed: true,
|
||||
current_commit: latestInstalled?.["current_commit"] || indexPlugin["current_commit"] || "",
|
||||
current_commit_timestamp: latestInstalled?.["current_commit_timestamp"] || indexPlugin["current_commit_timestamp"] || "",
|
||||
has_update: this._hasMarketplaceUpdate(indexPlugin, latestInstalled),
|
||||
has_update: this._hasPluginHubUpdate(indexPlugin, latestInstalled),
|
||||
};
|
||||
this.detailThumbnailUrl = this.getThumbnailUrl(this.selectedPlugin);
|
||||
},
|
||||
|
|
@ -684,15 +684,15 @@ const model = {
|
|||
return this.installedPluginInfo?.["current_commit_timestamp"] || this.selectedPlugin?.["current_commit_timestamp"] || "";
|
||||
},
|
||||
|
||||
getLatestMarketplaceVersion() {
|
||||
getLatestPluginHubVersion() {
|
||||
return this.selectedPlugin?.["version"] || "";
|
||||
},
|
||||
|
||||
getLatestMarketplaceCommit() {
|
||||
getLatestPluginHubCommit() {
|
||||
return this.selectedPlugin?.["commit"] || "";
|
||||
},
|
||||
|
||||
getLatestMarketplaceCommitTimestamp() {
|
||||
getLatestPluginHubCommitTimestamp() {
|
||||
return this.selectedPlugin?.["updated"] || "";
|
||||
},
|
||||
|
||||
|
|
@ -708,7 +708,7 @@ const model = {
|
|||
const confirmed = await showConfirmDialog({
|
||||
...SECURITY_WARNING,
|
||||
extensionContext: {
|
||||
kind: "marketplace_plugin_install_warning",
|
||||
kind: "plugin_hub_plugin_install_warning",
|
||||
source: "plugin_installer",
|
||||
pluginKey,
|
||||
pluginTitle: pluginRecord["title"] || pluginKey,
|
||||
|
|
@ -800,8 +800,8 @@ const model = {
|
|||
|
||||
/** Refresh related list views after installer/detail actions. */
|
||||
refreshPluginList() {
|
||||
const marketplaceActive = pluginListStore.activeTab === "marketplace";
|
||||
if (marketplaceActive) {
|
||||
const pluginHubActive = pluginListStore.activeTab === "pluginHub";
|
||||
if (pluginHubActive) {
|
||||
void this.fetchIndex();
|
||||
}
|
||||
pluginListStore.refresh();
|
||||
|
|
|
|||
|
|
@ -4,18 +4,18 @@ const NOTE_CLASS = "confirm-dialog-extension-note";
|
|||
const BUTTON_CLASS = "confirm-dialog-plugin-scan-button";
|
||||
const DIALOG_CLOSE_DELAY_MS = 220;
|
||||
|
||||
function isMarketplaceInstallWarning(extensionContext) {
|
||||
function isPluginHubInstallWarning(extensionContext) {
|
||||
return (
|
||||
extensionContext?.kind === "marketplace_plugin_install_warning"
|
||||
extensionContext?.kind === "plugin_hub_plugin_install_warning"
|
||||
&& extensionContext?.source === "plugin_installer"
|
||||
&& typeof extensionContext?.gitUrl === "string"
|
||||
&& extensionContext.gitUrl.trim().length > 0
|
||||
);
|
||||
}
|
||||
|
||||
export default async function addMarketplaceScanAction(context) {
|
||||
export default async function addPluginHubScanAction(context) {
|
||||
const extensionContext = context?.extensionContext;
|
||||
if (!isMarketplaceInstallWarning(extensionContext)) return;
|
||||
if (!isPluginHubInstallWarning(extensionContext)) return;
|
||||
|
||||
const bodyElement = context?.bodyElement;
|
||||
const footerElement = context?.footerElement;
|
||||
|
|
@ -1,14 +1,14 @@
|
|||
---
|
||||
name: a0-contribute-plugin
|
||||
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.
|
||||
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.
|
||||
version: 1.0.0
|
||||
tags: ["plugins", "contribute", "publish", "marketplace", "community", "index", "PR"]
|
||||
tags: ["plugins", "contribute", "publish", "plugin-hub", "community", "index", "PR"]
|
||||
trigger_patterns:
|
||||
- "contribute plugin"
|
||||
- "publish plugin"
|
||||
- "share plugin"
|
||||
- "submit plugin"
|
||||
- "plugin marketplace"
|
||||
- "contribute to plugin hub"
|
||||
- "plugin index"
|
||||
- "community plugin"
|
||||
- "open source plugin"
|
||||
|
|
@ -51,7 +51,7 @@ The plugin must live in its **own standalone GitHub repository** with plugin con
|
|||
```text
|
||||
your-plugin-repo/ <- GitHub repository root
|
||||
├── plugin.yaml <- runtime manifest (REQUIRED)
|
||||
├── README.md <- strongly recommended (shown in marketplace detail view)
|
||||
├── README.md <- strongly recommended (shown in Plugin Hub detail view)
|
||||
├── LICENSE <- strongly recommended
|
||||
├── default_config.yaml <- optional
|
||||
├── api/
|
||||
|
|
|
|||
|
|
@ -373,8 +373,8 @@ For a fully guided contribution flow (including git operations), read `/a0/skill
|
|||
|
||||
---
|
||||
|
||||
## Plugin Index & Marketplace
|
||||
## Plugin Index & Plugin Hub
|
||||
|
||||
The **Plugin Index** is the community hub at https://github.com/agent0ai/a0-plugins.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
---
|
||||
name: a0-manage-plugin
|
||||
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.
|
||||
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.
|
||||
version: 1.2.0
|
||||
tags: ["plugins", "install", "uninstall", "update", "scan", "security", "debug", "troubleshoot", "marketplace", "manage"]
|
||||
tags: ["plugins", "install", "uninstall", "update", "scan", "security", "debug", "troubleshoot", "plugin-hub", "manage"]
|
||||
trigger_patterns:
|
||||
- "install plugin"
|
||||
- "uninstall plugin"
|
||||
|
|
@ -17,7 +17,7 @@ trigger_patterns:
|
|||
- "plugin not working"
|
||||
- "enable plugin"
|
||||
- "disable plugin"
|
||||
- "plugin marketplace"
|
||||
- "plugin hub"
|
||||
- "list plugins"
|
||||
---
|
||||
|
||||
|
|
@ -29,7 +29,7 @@ Identify what the user needs and jump to the relevant section:
|
|||
|
||||
| User need | Section |
|
||||
|---|---|
|
||||
| Find / search / browse available plugins | [Browse Marketplace](#browse-marketplace) |
|
||||
| Find / search / browse available plugins | [Browse Plugin Hub](#browse-plugin-hub) |
|
||||
| Scan a plugin for security issues | [Security Scan](#security-scan) |
|
||||
| Install a plugin | [Install a Plugin](#install-a-plugin) |
|
||||
| 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:
|
|||
|
||||
---
|
||||
|
||||
## Browse Marketplace
|
||||
## Browse Plugin Hub
|
||||
|
||||
Fetch the current community index:
|
||||
|
||||
|
|
@ -63,7 +63,7 @@ Each entry in `plugins` is keyed by plugin name with fields: `title`, `descripti
|
|||
ls /a0/usr/plugins/
|
||||
```
|
||||
|
||||
**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).
|
||||
**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).
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -125,10 +125,10 @@ If the scan times out or errors (500), inform the user and ask whether to procee
|
|||
|
||||
### How installed state works
|
||||
|
||||
The marketplace marks a plugin as **Installed** by cross-referencing marketplace keys against `usr/plugins/` directory names at request time. To appear installed:
|
||||
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:
|
||||
- The plugin directory must exist at `usr/plugins/<name>/` with a valid `plugin.yaml`
|
||||
- The framework plugin cache must be cleared (the API handles this automatically)
|
||||
- Re-fetching the marketplace index will then show it as installed
|
||||
- Re-fetching the Plugin Hub index will then show it as installed
|
||||
|
||||
### API authentication (required for all HTTP calls)
|
||||
|
||||
|
|
@ -182,15 +182,15 @@ resp = s.post(
|
|||
print(resp.json())
|
||||
```
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
### Method 2: From the Marketplace (UI) - preferred for interactive use
|
||||
### Method 2: From the Plugin Hub (UI) - preferred for interactive use
|
||||
|
||||
1. Open the Plugins dialog
|
||||
2. Go to the **Browse** tab (or click **Install**)
|
||||
3. Find the plugin, click it, click **Install**
|
||||
|
||||
The UI handles everything including marking the plugin as installed in the marketplace view.
|
||||
The UI handles everything including marking the plugin as installed in the Plugin Hub view.
|
||||
|
||||
### Method 3: From a ZIP file (via HTTP API)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
---
|
||||
name: a0-plugin-router
|
||||
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.
|
||||
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.
|
||||
version: 1.0.0
|
||||
tags: ["plugins", "router", "meta", "create", "review", "contribute", "manage", "marketplace"]
|
||||
tags: ["plugins", "router", "meta", "create", "review", "contribute", "manage", "plugin-hub"]
|
||||
trigger_patterns:
|
||||
- "plugin"
|
||||
- "create plugin"
|
||||
|
|
@ -12,7 +12,7 @@ trigger_patterns:
|
|||
- "publish plugin"
|
||||
- "install plugin"
|
||||
- "manage plugin"
|
||||
- "marketplace"
|
||||
- "plugin hub"
|
||||
- "plugin index"
|
||||
- "how does the plugin system work"
|
||||
---
|
||||
|
|
|
|||
|
|
@ -38,19 +38,19 @@
|
|||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link"
|
||||
:class="{ active: $store.pluginListStore.activeTab === 'marketplace' }"
|
||||
id="plugins-marketplace-tab"
|
||||
:class="{ active: $store.pluginListStore.activeTab === 'pluginHub' }"
|
||||
id="plugins-plugin-hub-tab"
|
||||
type="button"
|
||||
role="tab"
|
||||
aria-controls="plugins-marketplace"
|
||||
:aria-selected="$store.pluginListStore.activeTab === 'marketplace'"
|
||||
@click="$store.pluginListStore.setTab('marketplace')">
|
||||
aria-controls="plugins-plugin-hub"
|
||||
:aria-selected="$store.pluginListStore.activeTab === 'pluginHub'"
|
||||
@click="$store.pluginListStore.setTab('pluginHub')">
|
||||
<span class="material-symbols-outlined pi-tab-icon">store</span> Browse
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<template x-if="$store.pluginListStore.activeTab !== 'marketplace'">
|
||||
<template x-if="$store.pluginListStore.activeTab !== 'pluginHub'">
|
||||
<div>
|
||||
<div class="plugins-toolbar">
|
||||
<div class="plugins-toolbar-search">
|
||||
|
|
@ -200,7 +200,7 @@
|
|||
</div>
|
||||
</template>
|
||||
|
||||
<template x-if="$store.pluginListStore.activeTab === 'marketplace'">
|
||||
<template x-if="$store.pluginListStore.activeTab === 'pluginHub'">
|
||||
<x-component path="/plugins/_plugin_installer/webui/install-index.html"></x-component>
|
||||
</template>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@ const model = {
|
|||
},
|
||||
|
||||
async setTab(tab) {
|
||||
if (tab === "marketplace") {
|
||||
this.activeTab = "marketplace";
|
||||
if (tab === "pluginHub") {
|
||||
this.activeTab = "pluginHub";
|
||||
this.loading = false;
|
||||
return;
|
||||
}
|
||||
|
|
@ -60,7 +60,7 @@ const model = {
|
|||
},
|
||||
|
||||
async refresh() {
|
||||
if (this.activeTab === "marketplace") {
|
||||
if (this.activeTab === "pluginHub") {
|
||||
return;
|
||||
}
|
||||
await this.setTab(this.activeTab);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue