use super::*; use pretty_assertions::assert_eq; use std::fs; use std::path::Path; const TEST_REWRITE_PROFILE: RewriteProfile = RewriteProfile::new( "CLAUDE.md", &[ "claude code", "claude-code", "claude_code", "claudecode", "claude", ], ); #[test] fn command_skill_names_must_fit_codex_skill_loader_limit() { let source_name = "this-is-a-deeply-nested-command-with-a-very-long-name"; let file = Path::new("commands/this/is/a/deeply/nested/command/with/a/very/long/name.md"); let document = parse_command_content("---\ndescription: Review PR\n---\nReview\n"); assert!( command_skill_name_if_supported( source_name, file, &document, CommandDescriptionMode::RequireFrontmatter, ) .is_none() ); } #[test] fn commands_with_overlong_descriptions_are_preserved() { let description = "x".repeat(1025); let document = parse_command_content(&format!("---\ndescription: {description}\n---\nReview\n")); assert_eq!( command_skill_name_if_supported( "review", Path::new("commands/review.md"), &document, CommandDescriptionMode::RequireFrontmatter, ), Some("source-command-review".to_string()) ); let rendered = render_command_skill( &document.body, "source-command-review", &description, "review", TEST_REWRITE_PROFILE, ); assert_eq!( parse_command_content(&rendered).description.as_deref(), Some(description.as_str()) ); } #[test] fn commands_with_provider_runtime_expansion_are_skipped() { let document = parse_command_content( "---\ndescription: Deploy\n---\nDeploy $ARGUMENTS from @release.yaml\n", ); assert!( command_skill_name_if_supported( "deploy", Path::new("commands/deploy.md"), &document, CommandDescriptionMode::RequireFrontmatter, ) .is_none() ); } #[test] fn commands_without_description_are_skipped() { let document = parse_command_content("Review the current change.\n"); assert!( command_skill_name_if_supported( "review", Path::new("commands/review.md"), &document, CommandDescriptionMode::RequireFrontmatter, ) .is_none() ); } #[test] fn commands_can_derive_descriptions_from_source_names() { let root = tempfile::TempDir::new().expect("tempdir"); let commands = root.path().join("commands"); let target_skills = root.path().join("skills"); fs::create_dir_all(&commands).expect("create commands"); fs::write( commands.join("review-code.md"), "Review the current change.\n", ) .expect("write command"); let profile = CommandMigrationProfile::new( TEST_REWRITE_PROFILE, CommandDescriptionMode::UseSourceNameFallback, ); assert_eq!( import_commands_with_profile(&commands, &target_skills, profile).unwrap(), vec!["source-command-review-code".to_string()] ); let rendered = fs::read_to_string( target_skills .join("source-command-review-code") .join("SKILL.md"), ) .expect("read migrated command"); assert!(rendered.contains("description: \"Migrated source command `review-code`\"")); assert!(rendered.contains("Review the current change.")); } #[test] fn command_slug_collisions_are_skipped() { let root = tempfile::TempDir::new().expect("tempdir"); let commands = root.path().join("commands"); fs::create_dir_all(&commands).expect("create commands"); fs::write( commands.join("foo-bar.md"), "---\ndescription: First\n---\nRun the first command.\n", ) .expect("write first command"); fs::write( commands.join("foo_bar.md"), "---\ndescription: Second\n---\nRun the second command.\n", ) .expect("write second command"); assert_eq!( unique_supported_command_sources(&commands, CommandDescriptionMode::RequireFrontmatter,) .unwrap(), Vec::::new() ); }