#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum Agent {
ClaudeCode,
Codex,
OpenCode,
Cursor,
Windsurf,
Aider,
Zed,
Gemini,
Copilot,
Continue,
Kiro,
Antigravity,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SkillFormat {
Folder,
Rule,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum Scope {
Project,
User,
}
pub const ALL_AGENTS: &[Agent] = &[
Agent::ClaudeCode,
Agent::Codex,
Agent::OpenCode,
Agent::Cursor,
Agent::Windsurf,
Agent::Aider,
Agent::Zed,
Agent::Gemini,
Agent::Copilot,
Agent::Continue,
Agent::Kiro,
Agent::Antigravity,
];
impl Agent {
pub fn parse(s: &str) -> Option<Agent> {
match s {
"claude" | "claude-code" | "claudecode" => Some(Agent::ClaudeCode),
"codex" => Some(Agent::Codex),
"opencode" | "open-code" => Some(Agent::OpenCode),
"cursor" => Some(Agent::Cursor),
"windsurf" => Some(Agent::Windsurf),
"aider" => Some(Agent::Aider),
"zed" => Some(Agent::Zed),
"gemini" | "gemini-cli" => Some(Agent::Gemini),
"copilot" | "github-copilot" => Some(Agent::Copilot),
"continue" | "continue-dev" => Some(Agent::Continue),
"kiro" => Some(Agent::Kiro),
"antigravity" => Some(Agent::Antigravity),
_ => None,
}
}
pub fn display(self) -> &'static str {
match self {
Agent::ClaudeCode => "Claude Code",
Agent::Codex => "Codex",
Agent::OpenCode => "OpenCode",
Agent::Cursor => "Cursor",
Agent::Windsurf => "Windsurf",
Agent::Aider => "Aider",
Agent::Zed => "Zed",
Agent::Gemini => "Gemini",
Agent::Copilot => "Copilot",
Agent::Continue => "Continue",
Agent::Kiro => "Kiro",
Agent::Antigravity => "Antigravity",
}
}
pub fn format(self) -> SkillFormat {
match self {
Agent::ClaudeCode | Agent::Codex | Agent::OpenCode => SkillFormat::Folder,
Agent::Cursor
| Agent::Windsurf
| Agent::Aider
| Agent::Zed
| Agent::Gemini
| Agent::Copilot
| Agent::Continue
| Agent::Kiro
| Agent::Antigravity => SkillFormat::Rule,
}
}
}