Skip to main content

codetether_agent/plugin_marketplace/
registry.rs

1//! Plugin registry — searchable catalog of community MCP tools.
2
3use serde::{Deserialize, Serialize};
4
5/// A plugin entry in the marketplace registry.
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct PluginEntry {
8    pub name: String,
9    pub version: String,
10    pub description: String,
11    pub author: String,
12    pub sha256: String,
13    pub signature: String,
14    pub download_url: String,
15    pub capabilities: Vec<String>,
16    pub downloads: u64,
17    pub rating: f32,
18    pub repo_url: Option<String>,
19}
20
21/// Search the plugin registry by name or capability.
22pub fn search_plugins<'a>(query: &str, plugins: &'a [PluginEntry]) -> Vec<&'a PluginEntry> {
23    let lower = query.to_lowercase();
24    plugins
25        .iter()
26        .filter(|p| {
27            p.name.to_lowercase().contains(&lower)
28                || p.description.to_lowercase().contains(&lower)
29                || p.capabilities
30                    .iter()
31                    .any(|c| c.to_lowercase().contains(&lower))
32        })
33        .collect()
34}
35
36/// Sort plugins by popularity (downloads + rating).
37pub fn by_popularity(plugins: &mut [&PluginEntry]) {
38    plugins.sort_by(|a, b| {
39        let score_a = a.downloads as f32 * a.rating;
40        let score_b = b.downloads as f32 * b.rating;
41        score_b.total_cmp(&score_a)
42    });
43}