pub mod api;
pub mod auditor;
pub mod dependency;
pub mod discovery;
pub mod error;
pub mod hot_reload;
pub mod performance;
pub mod progressive_disclosure;
pub mod sandbox;
pub mod skill_md;
pub mod tags;
pub mod tool_restriction;
pub mod trait_impl;
pub mod types;
pub mod version;
pub mod vscode;
#[cfg(test)]
mod tests;
#[cfg(test)]
mod integration_tests;
use std::path::Path;
pub use trait_impl::{Skill, SkillBox};
pub use discovery::{
discover_from_dir, discover_from_multiple_dirs, discover_skill_md_from_dir,
};
pub use api::{ListSkillsResponse, SkillApiInfo, SkillsApiClient, SkillsError, UploadSkillResponse};
pub use auditor::{
AuditConfig, AuditError, IssueType, RiskLevel, SkillAuditor, SkillAuditIssue, SkillAuditReport,
};
pub use dependency::{Dependency, DependencyResolver, ResolutionResult};
pub use error::{SkillError, SkillOutput, SkillResult};
pub use hot_reload::{HotReloadConfig, HotReloadEvent, HotReloadManager, HotReloadWatcher};
pub use performance::{BatchOperations, IndexedSkillCollection, LruCache, PerformanceStats};
pub use progressive_disclosure::ProgressiveSkillLoader;
pub use sandbox::{SandboxConfig, SandboxExecutor, SandboxResult, SandboxUtils};
pub use skill_md::{HookConfig, HookType, SkillContext, SkillHooks, SkillMdError, SkillMdFile, SkillMdMetadata, SkillsDirScanner};
pub use tags::{TagFilter, TagOperator, TagQueryBuilder, TagUtils};
pub use tool_restriction::{ToolRestriction, ToolRestrictionError};
pub use types::{SkillInput, SkillMetadata, SkillPackage, SkillResources, SkillStatus};
pub use version::{CompatibilityResult, VersionManager};
pub use vscode::{VsCodeExportConfig, VsCodeUtils, export_batch_to_vscode, export_to_vscode};
pub struct SkillRegistry {
skills: std::collections::HashMap<String, Box<dyn Skill>>,
}
impl Default for SkillRegistry {
fn default() -> Self {
Self::new()
}
}
impl SkillRegistry {
pub fn new() -> Self {
Self {
skills: std::collections::HashMap::new(),
}
}
pub fn register(&mut self, skill: Box<dyn Skill>) -> Result<(), SkillError> {
let name = skill.name();
skill.validate()?;
self.skills.insert(name, skill);
Ok(())
}
pub fn get(&self, name: &str) -> Option<&dyn Skill> {
self.skills.get(name).map(|s| s.as_ref())
}
pub fn list(&self) -> Vec<String> {
self.skills.keys().cloned().collect()
}
pub fn discover_from_dir<P: AsRef<Path>>(dir: P) -> Result<Vec<SkillPackage>, SkillError> {
discovery::discover_from_dir(dir)
}
pub fn discover_skill_md_from_dir<P: AsRef<Path>>(dir: P) -> Result<Vec<SkillPackage>, SkillError> {
discovery::discover_skill_md_from_dir(dir)
}
pub fn discover_from_multiple_dirs<P: AsRef<Path>>(dirs: Vec<P>) -> Result<Vec<SkillPackage>, SkillError> {
discovery::discover_from_multiple_dirs(dirs)
}
}