use std::io;
use std::path::Path;
use serde::{Deserialize, Serialize};
use crate::core::ToolInvocation;
use super::TranscriptSummary;
use super::skill_shadow::PluginShadowReport;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum TranscriptParser {
ClaudeStreamJson,
CodexItems,
}
impl TranscriptParser {
pub(crate) fn parse(self, path: &Path) -> io::Result<Vec<ToolInvocation>> {
match self {
TranscriptParser::ClaudeStreamJson => {
super::claude_code::stream_json::parse_claude_stream_json(path)
}
TranscriptParser::CodexItems => super::codex::transcript::parse_codex_events(path),
}
}
pub(crate) fn parse_full(self, path: &Path) -> io::Result<TranscriptSummary> {
match self {
TranscriptParser::ClaudeStreamJson => {
super::claude_code::stream_json::parse_claude_stream_json_full(path)
}
TranscriptParser::CodexItems => super::codex::transcript::parse_codex_events_full(path),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum SlugCapability {
Opencode,
}
impl SlugCapability {
pub(crate) fn staged_slug(
self,
prefix: &str,
iteration: u32,
condition: &str,
skill_name: &str,
) -> String {
match self {
SlugCapability::Opencode => {
super::opencode::opencode_slug(prefix, iteration, condition, skill_name)
}
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum ShadowPreflight {
ClaudePlugins,
}
impl ShadowPreflight {
pub(crate) fn detect(
self,
scan_root: &Path,
staged_skill_names: &[&str],
) -> Option<PluginShadowReport> {
match self {
ShadowPreflight::ClaudePlugins => super::claude_code::plugin_shadow::shadow_preflight(
&super::claude_code::plugin_shadow::config_dir_from_env(),
scan_root,
staged_skill_names,
),
}
}
}