use std::path::PathBuf;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SkillsReadInput {
pub name: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SkillsReadAssetInput {
pub name: String,
pub asset_path: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SkillsMatchInput {
pub match_paths: Vec<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct SkillInfo {
pub name: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct SkillContent {
pub info: SkillInfo,
pub body: String,
}
#[derive(Debug, Clone)]
pub enum SkillSource {
Directory { path: String },
Embedded { skill: EmbeddedSkill },
}
#[derive(Debug, Clone)]
pub struct EmbeddedSkill {
pub name: String,
pub description: String,
pub content: String,
pub globs: Vec<String>,
pub always_apply: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SkillAction {
List,
Read,
ReadAsset,
Match,
}
#[derive(Debug, Clone)]
pub struct SkillSchema {
pub action: SkillAction,
pub sources: Vec<SkillSource>,
pub skill_name: Option<String>,
pub asset_path: Option<String>,
pub match_paths: Vec<String>,
pub recursive: bool,
pub ignore: Vec<String>,
pub include: Vec<String>,
}
#[derive(Debug, Clone, Serialize)]
pub enum SkillOutput {
List { skills: Vec<SkillInfo> },
Read { skill: SkillContent },
ReadAsset { content: String },
Match { matched: Vec<SkillInfo> },
}
#[derive(Debug, Error)]
pub enum SkillError {
#[error("skill not found: {0}")]
NotFound(String),
#[error("path traversal detected: {0}")]
PathTraversal(String),
#[error("invalid action: {0}")]
InvalidAction(String),
#[error("invalid source: {0}")]
InvalidSource(String),
}
#[derive(Debug, Default)]
pub struct Frontmatter {
pub name: Option<String>,
pub description: Option<String>,
pub globs: Vec<String>,
pub always_apply: bool,
}
#[derive(Debug, Clone)]
pub struct RawSkill {
pub source_key: String,
pub name: String,
pub description: String,
pub base_dir: PathBuf,
pub body: String,
pub globs: Vec<String>,
pub always_apply: bool,
}