The composed Codex deploy set (sourced from the shared `plugin/` tree via `codex_files`) must cover every shared model-invocable skill and the 13 canonical `tracedecay-*` workflow dispatchers, plus Codex's manifest, `.mcp.json`, hooks, and README. Codex has no slash-command or `disable-model-invocation` surface, so it ships all 29 skills in their canonical (model-invocable) form. The single shared
(root: &Path)
| 193 | /// `codex_bundle_ships_exactly_the_model_invocable_cursor_skills` checks. |
| 194 | /// Every file under a skills root, relative to it, forward-slashed. |
| 195 | fn skill_tree_files(root: &Path) -> Vec<String> { |
| 196 | let mut files: Vec<String> = crate::agents::collect_regular_files(root) |
| 197 | .expect("skills dir readable") |
| 198 | .into_iter() |
| 199 | .filter_map(|path| { |
| 200 | path.strip_prefix(root) |
| 201 | .ok() |
| 202 | .map(|rel| rel.to_string_lossy().replace('\\', "/")) |
| 203 | }) |
| 204 | .collect(); |
| 205 | files.sort(); |
| 206 | files |
| 207 | } |
| 208 | |
| 209 | #[test] |
| 210 | fn codex_embedded_file_list_covers_the_whole_source_bundle() { |
no test coverage detected