1use serde::{Deserialize, Serialize};
2
3use super::harness::{Harness, SourceType};
4use super::provider::Provider;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8pub enum SkillType {
9 #[serde(rename = "skill")]
10 Skill,
11}
12
13impl std::fmt::Display for SkillType {
14 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15 match self {
16 SkillType::Skill => write!(f, "skill"),
17 }
18 }
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
23#[serde(deny_unknown_fields)]
24pub struct Skill {
25 pub id: String,
26 pub name: String,
27 #[serde(rename = "type")]
28 pub entity_type: SkillType,
29 pub provider: Provider,
30 pub harnesses: Vec<Harness>,
31 pub summary: String,
32 pub source_type: SourceType,
33 pub official_docs: Vec<String>,
34 pub security_notes: String,
35 pub last_verified: String,
36 pub path: String,
37 pub author: Option<String>,
38 pub version: Option<String>,
39 #[serde(default)]
40 pub category: Option<String>,
41 #[serde(default)]
42 pub certifications: Option<Vec<String>>,
43 #[serde(default)]
44 pub companion_agents: Option<Vec<String>>,
45 #[serde(default)]
46 pub companion_review_skills: Option<Vec<String>>,
47 #[serde(default)]
48 pub companion_skills: Option<Vec<String>>,
49 #[serde(default)]
50 pub execution_tier: Option<String>,
51 #[serde(default)]
52 pub feeds_skills: Option<Vec<String>>,
53 #[serde(default)]
54 pub lifecycle: Option<String>,
55 #[serde(default)]
56 pub mcp_servers: Option<Vec<String>>,
57 #[serde(default)]
58 pub oauth_scopes: Option<Vec<String>>,
59 #[serde(default)]
60 pub production_allowed: Option<bool>,
61 #[serde(default)]
62 pub run_as_permissions: Option<serde_json::Value>,
63 #[serde(default)]
64 pub sandbox_only: Option<bool>,
65 #[serde(default)]
66 pub source_attribution: Option<String>,
67 #[serde(default)]
68 pub verify_before_merge: Option<String>,
69}