mirror of
https://github.com/openai/codex.git
synced 2026-05-16 09:12:54 +00:00
## Summary - thread plugin skill roots through the skills loader with their plugin ID - store plugin ID on loaded skill metadata for plugin-provided skills - include plugin ID on skill invocation analytics events ## Test plan - cargo check -p codex-core-skills - cargo check -p codex-core -p codex-core-plugins -p codex-analytics - cargo check -p codex-tui - cargo check -p codex-plugin -p codex-core -p codex-core-plugins -p codex-analytics - cargo check -p codex-app-server - cargo test -p codex-analytics - HOME=/private/tmp/codex-empty-home cargo test -p codex-core-skills - just fix -p codex-core-skills - just fix -p codex-analytics - just fix -p codex-core-plugins - just fix -p codex-core - just fmt - git diff --check
124 lines
3.9 KiB
Rust
124 lines
3.9 KiB
Rust
use super::SkillLoadOutcome;
|
|
use super::SkillMetadata;
|
|
use super::canonicalize_if_exists;
|
|
use super::detect_skill_doc_read;
|
|
use super::detect_skill_script_run;
|
|
use super::script_run_token;
|
|
use codex_utils_absolute_path::AbsolutePathBuf;
|
|
use codex_utils_absolute_path::test_support::PathBufExt;
|
|
use codex_utils_absolute_path::test_support::test_path_buf;
|
|
use pretty_assertions::assert_eq;
|
|
use std::collections::HashMap;
|
|
use std::sync::Arc;
|
|
|
|
fn test_skill_metadata(skill_doc_path: AbsolutePathBuf) -> SkillMetadata {
|
|
SkillMetadata {
|
|
name: "test-skill".to_string(),
|
|
description: "test".to_string(),
|
|
short_description: None,
|
|
interface: None,
|
|
dependencies: None,
|
|
policy: None,
|
|
path_to_skills_md: skill_doc_path,
|
|
scope: codex_protocol::protocol::SkillScope::User,
|
|
plugin_id: None,
|
|
}
|
|
}
|
|
|
|
fn test_path_display(unix_path: &str) -> String {
|
|
test_path_buf(unix_path).display().to_string()
|
|
}
|
|
|
|
#[test]
|
|
fn script_run_detection_matches_runner_plus_extension() {
|
|
let tokens = vec![
|
|
"python3".to_string(),
|
|
"-u".to_string(),
|
|
"scripts/fetch_comments.py".to_string(),
|
|
];
|
|
|
|
assert_eq!(script_run_token(&tokens).is_some(), true);
|
|
}
|
|
|
|
#[test]
|
|
fn script_run_detection_excludes_python_c() {
|
|
let tokens = vec![
|
|
"python3".to_string(),
|
|
"-c".to_string(),
|
|
"print(1)".to_string(),
|
|
];
|
|
|
|
assert_eq!(script_run_token(&tokens).is_some(), false);
|
|
}
|
|
|
|
#[test]
|
|
fn skill_doc_read_detection_matches_absolute_path() {
|
|
let skill_doc_path = test_path_buf("/tmp/skill-test/SKILL.md").abs();
|
|
let normalized_skill_doc_path = canonicalize_if_exists(&skill_doc_path);
|
|
let skill = test_skill_metadata(skill_doc_path);
|
|
let outcome = SkillLoadOutcome {
|
|
implicit_skills_by_scripts_dir: Arc::new(HashMap::new()),
|
|
implicit_skills_by_doc_path: Arc::new(HashMap::from([(normalized_skill_doc_path, skill)])),
|
|
..Default::default()
|
|
};
|
|
|
|
let tokens = vec![
|
|
"cat".to_string(),
|
|
test_path_display("/tmp/skill-test/SKILL.md"),
|
|
"|".to_string(),
|
|
"head".to_string(),
|
|
];
|
|
let found = detect_skill_doc_read(&outcome, &tokens, &test_path_buf("/tmp").abs());
|
|
|
|
assert_eq!(
|
|
found.map(|value| value.name),
|
|
Some("test-skill".to_string())
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn skill_script_run_detection_matches_relative_path_from_skill_root() {
|
|
let skill_doc_path = test_path_buf("/tmp/skill-test/SKILL.md").abs();
|
|
let scripts_dir = canonicalize_if_exists(&test_path_buf("/tmp/skill-test/scripts").abs());
|
|
let skill = test_skill_metadata(skill_doc_path);
|
|
let outcome = SkillLoadOutcome {
|
|
implicit_skills_by_scripts_dir: Arc::new(HashMap::from([(scripts_dir, skill)])),
|
|
implicit_skills_by_doc_path: Arc::new(HashMap::new()),
|
|
..Default::default()
|
|
};
|
|
let tokens = vec![
|
|
"python3".to_string(),
|
|
"scripts/fetch_comments.py".to_string(),
|
|
];
|
|
|
|
let found = detect_skill_script_run(&outcome, &tokens, &test_path_buf("/tmp/skill-test").abs());
|
|
|
|
assert_eq!(
|
|
found.map(|value| value.name),
|
|
Some("test-skill".to_string())
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn skill_script_run_detection_matches_absolute_path_from_any_workdir() {
|
|
let skill_doc_path = test_path_buf("/tmp/skill-test/SKILL.md").abs();
|
|
let scripts_dir = canonicalize_if_exists(&test_path_buf("/tmp/skill-test/scripts").abs());
|
|
let skill = test_skill_metadata(skill_doc_path);
|
|
let outcome = SkillLoadOutcome {
|
|
implicit_skills_by_scripts_dir: Arc::new(HashMap::from([(scripts_dir, skill)])),
|
|
implicit_skills_by_doc_path: Arc::new(HashMap::new()),
|
|
..Default::default()
|
|
};
|
|
let tokens = vec![
|
|
"python3".to_string(),
|
|
test_path_display("/tmp/skill-test/scripts/fetch_comments.py"),
|
|
];
|
|
|
|
let found = detect_skill_script_run(&outcome, &tokens, &test_path_buf("/tmp/other").abs());
|
|
|
|
assert_eq!(
|
|
found.map(|value| value.name),
|
|
Some("test-skill".to_string())
|
|
);
|
|
}
|