1use std::path::PathBuf;
8
9use serde::{Deserialize, Serialize};
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct PluginManifest {
13 pub name: String,
14 pub version: String,
15 pub entry: PathBuf,
16 #[serde(default)]
17 pub capabilities: Vec<Capability>,
18 #[serde(default)]
19 pub description: String,
20}
21
22#[derive(Debug, Clone, Copy, Serialize, Deserialize, Eq, PartialEq)]
23#[serde(rename_all = "kebab-case")]
24pub enum Capability {
25 McpTool,
27 TuiPanel,
29 EventConsumer,
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36
37 #[test]
38 fn manifest_parses_minimal_toml() {
39 let s = r#"
40 name = "icebreaker"
41 version = "0.1.0"
42 entry = "icebreaker.wasm"
43 capabilities = ["mcp-tool"]
44 description = "promptfoo+garak+PyRIT red-team bundle"
45 "#;
46 let m: PluginManifest = toml::from_str(s).expect("parse");
47 assert_eq!(m.name, "icebreaker");
48 assert_eq!(m.capabilities, vec![Capability::McpTool]);
49 }
50}