Skip to main content

mur_common/skill/
types.rs

1//! Skill type enums.
2
3use serde::{Deserialize, Serialize};
4
5/// Which host(s) may load a skill. See spec §2.3.
6#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
7#[serde(rename_all = "kebab-case")]
8pub enum HostId {
9    MurAgent,
10    MurCommander,
11    /// Default when `hosts:` is omitted — backward compatible.
12    #[default]
13    All,
14    #[serde(untagged)]
15    Custom(String),
16}
17
18/// Three-tier skill trust model. Mirrors mur-commander `trust/level.rs`.
19#[derive(
20    Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, PartialOrd, Ord, Default,
21)]
22#[serde(rename_all = "kebab-case")]
23pub enum TrustLevel {
24    /// Peer transfer, agent-generated, untrusted registry.
25    #[default]
26    Sandboxed,
27    /// Registry-verified checksum match, community-reviewed.
28    Verified,
29    /// Built-in, user-promoted, or trusted-publisher-signed.
30    Trusted,
31}
32
33/// Top-level skill category.
34#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
35#[serde(rename_all = "lowercase")]
36pub enum Category {
37    Context,
38    Workflow,
39    Command,
40    Meta,
41}
42
43/// Exactly one content mode is populated; see spec §3.2.3.
44#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
45#[serde(rename_all = "lowercase")]
46pub enum ContentMode {
47    Context,
48    Workflow,
49    Command,
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
53#[serde(rename_all = "lowercase")]
54pub enum Priority {
55    Low,
56    #[default]
57    Normal,
58    High,
59    Critical,
60}
61
62#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Ord, PartialOrd)]
63#[serde(rename_all = "snake_case")]
64pub enum TriggerKind {
65    Command,
66    Keyword,
67    SessionStart,
68    Manual,
69}
70
71#[cfg(test)]
72mod tests {
73    use super::*;
74
75    #[test]
76    fn host_id_serialises_kebab_case() {
77        let yaml = serde_yaml_ng::to_string(&HostId::MurAgent).unwrap();
78        assert_eq!(yaml.trim(), "mur-agent");
79    }
80
81    #[test]
82    fn trust_level_ordering_matches_spec() {
83        assert!(TrustLevel::Sandboxed < TrustLevel::Verified);
84        assert!(TrustLevel::Verified < TrustLevel::Trusted);
85    }
86
87    #[test]
88    fn host_id_default_is_all() {
89        assert_eq!(HostId::default(), HostId::All);
90    }
91}