ext/skills/src/fragments.rs
61 lines
use codex_core_skills::render_available_skills_body;use codex_extension_api::ContextualUserFragment;use codex_protocol::protocol::SKILLS_INSTRUCTIONS_CLOSE_TAG;use codex_protocol::protocol::SKILLS_INSTRUCTIONS_OPEN_TAG;#[derive(Clone, Debug, Eq, PartialEq)]pub(crate) struct AvailableSkillsInstructions { skill_lines: Vec<String>,}impl AvailableSkillsInstructions { pub(crate) fn from_skill_lines(skill_lines: Vec<String>) -> Self { Self { skill_lines } }}impl ContextualUserFragment for AvailableSkillsInstructions { fn role(&self) -> &'static str { "developer" } fn markers(&self) -> (&'static str, &'static str) { Self::type_markers() } fn type_markers() -> (&'static str, &'static str) { (SKILLS_INSTRUCTIONS_OPEN_TAG, SKILLS_INSTRUCTIONS_CLOSE_TAG) } fn body(&self) -> String { render_available_skills_body(&[], &self.skill_lines) }}#[derive(Clone, Debug, Eq, PartialEq)]pub(crate) struct SkillInstructions { pub(crate) name: String, pub(crate) path: String, pub(crate) contents: String,}impl ContextualUserFragment for SkillInstructions { fn role(&self) -> &'static str { "user" } fn markers(&self) -> (&'static str, &'static str) { Self::type_markers() } fn type_markers() -> (&'static str, &'static str) { ("<skill>", "</skill>") } fn body(&self) -> String { let name = &self.name; let path = &self.path; let contents = &self.contents; format!("\n<name>{name}</name>\n<path>{path}</path>\n{contents}\n") }}