mirror of
https://github.com/openai/codex.git
synced 2026-04-30 11:21:34 +03:00
## Summary - move skill loading and management into codex-core-skills - leave codex-core with the thin integration layer and shared wiring ## Testing - CI --------- Co-authored-by: Codex <noreply@openai.com>
49 lines
3.2 KiB
Rust
49 lines
3.2 KiB
Rust
use crate::model::SkillMetadata;
|
|
use codex_protocol::protocol::SKILLS_INSTRUCTIONS_CLOSE_TAG;
|
|
use codex_protocol::protocol::SKILLS_INSTRUCTIONS_OPEN_TAG;
|
|
|
|
pub fn render_skills_section(skills: &[SkillMetadata]) -> Option<String> {
|
|
if skills.is_empty() {
|
|
return None;
|
|
}
|
|
|
|
let mut lines: Vec<String> = Vec::new();
|
|
lines.push("## Skills".to_string());
|
|
lines.push("A skill is a set of local instructions to follow that is stored in a `SKILL.md` file. Below is the list of skills that can be used. Each entry includes a name, description, and file path so you can open the source for full instructions when using a specific skill.".to_string());
|
|
lines.push("### Available skills".to_string());
|
|
|
|
for skill in skills {
|
|
let path_str = skill.path_to_skills_md.to_string_lossy().replace('\\', "/");
|
|
let name = skill.name.as_str();
|
|
let description = skill.description.as_str();
|
|
lines.push(format!("- {name}: {description} (file: {path_str})"));
|
|
}
|
|
|
|
lines.push("### How to use skills".to_string());
|
|
lines.push(
|
|
r###"- Discovery: The list above is the skills available in this session (name + description + file path). Skill bodies live on disk at the listed paths.
|
|
- Trigger rules: If the user names a skill (with `$SkillName` or plain text) OR the task clearly matches a skill's description shown above, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned.
|
|
- Missing/blocked: If a named skill isn't in the list or the path can't be read, say so briefly and continue with the best fallback.
|
|
- How to use a skill (progressive disclosure):
|
|
1) After deciding to use a skill, open its `SKILL.md`. Read only enough to follow the workflow.
|
|
2) When `SKILL.md` references relative paths (e.g., `scripts/foo.py`), resolve them relative to the skill directory listed above first, and only consider other paths if needed.
|
|
3) If `SKILL.md` points to extra folders such as `references/`, load only the specific files needed for the request; don't bulk-load everything.
|
|
4) If `scripts/` exist, prefer running or patching them instead of retyping large code blocks.
|
|
5) If `assets/` or templates exist, reuse them instead of recreating from scratch.
|
|
- Coordination and sequencing:
|
|
- If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them.
|
|
- Announce which skill(s) you're using and why (one short line). If you skip an obvious skill, say why.
|
|
- Context hygiene:
|
|
- Keep context small: summarize long sections instead of pasting them; only load extra files when needed.
|
|
- Avoid deep reference-chasing: prefer opening only files directly linked from `SKILL.md` unless you're blocked.
|
|
- When variants exist (frameworks, providers, domains), pick only the relevant reference file(s) and note that choice.
|
|
- Safety and fallback: If a skill can't be applied cleanly (missing files, unclear instructions), state the issue, pick the next-best approach, and continue."###
|
|
.to_string(),
|
|
);
|
|
|
|
let body = lines.join("\n");
|
|
Some(format!(
|
|
"{SKILLS_INSTRUCTIONS_OPEN_TAG}\n{body}\n{SKILLS_INSTRUCTIONS_CLOSE_TAG}"
|
|
))
|
|
}
|