Codex Handbook
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")    }}