1pub mod error;
37pub mod loader;
38pub mod mode;
39pub mod registry;
40pub mod template;
41pub mod tool_config;
42pub mod validator;
43
44pub use error::{ModeError, ModeResult};
46pub use loader::ModeLoader;
47pub use mode::{MiyabiMode, ToolGroup};
48pub use registry::ModeRegistry;
49pub use template::TemplateRenderer;
50pub use tool_config::{ToolConfig, ToolConfigSet};
51pub use validator::ModeValidator;
52
53#[cfg(test)]
54mod integration_tests {
55 use super::*;
56 use std::fs;
57 use tempfile::TempDir;
58
59 #[test]
60 fn test_full_workflow() {
61 let temp_dir = TempDir::new().unwrap();
63 let modes_dir = temp_dir.path().join(".miyabi/modes/system");
64 fs::create_dir_all(&modes_dir).unwrap();
65
66 let yaml = r#"
68slug: test-mode
69name: "🧪 Test Mode"
70character: "てすとん"
71roleDefinition: "You are a test mode for validation and integration testing."
72whenToUse: "Use this mode for testing the mode system."
73groups:
74 - read
75 - edit
76 - command
77customInstructions: |-
78 Always write comprehensive tests.
79 Follow Rust best practices.
80source: "miyabi-core"
81fileRegex: ".*\\.rs$"
82"#;
83 fs::write(modes_dir.join("test-mode.yaml"), yaml).unwrap();
84
85 let loader = ModeLoader::new(temp_dir.path());
87 let modes = loader.load_all().unwrap();
88 assert_eq!(modes.len(), 1);
89
90 let registry = ModeRegistry::new();
92 registry.register_all(modes).unwrap();
93
94 assert_eq!(registry.count(), 1);
96 assert!(registry.contains("test-mode"));
97
98 let mode = registry.get("test-mode").unwrap();
100 assert_eq!(mode.slug, "test-mode");
101 assert_eq!(mode.character, "てすとん");
102 assert!(mode.is_system_mode());
103
104 assert!(ModeValidator::validate(&mode).is_ok());
106
107 assert!(mode.matches_file("main.rs").unwrap());
109 assert!(!mode.matches_file("README.md").unwrap());
110
111 assert!(mode.allows_tool(&ToolGroup::Read));
113 assert!(mode.allows_tool(&ToolGroup::Edit));
114 assert!(!mode.allows_tool(&ToolGroup::Browser));
115 }
116}