diff --git a/skills/docx/scripts/accept_changes.py b/skills/docx/scripts/accept_changes.py old mode 100644 new mode 100755 diff --git a/skills/docx/scripts/comment.py b/skills/docx/scripts/comment.py old mode 100644 new mode 100755 diff --git a/skills/pdf/scripts/extract_form_structure.py b/skills/pdf/scripts/extract_form_structure.py old mode 100644 new mode 100755 diff --git a/skills/pptx/scripts/add_slide.py b/skills/pptx/scripts/add_slide.py old mode 100644 new mode 100755 diff --git a/skills/pptx/scripts/thumbnail.py b/skills/pptx/scripts/thumbnail.py old mode 100644 new mode 100755 diff --git a/skills/skill-creator/SKILL.md b/skills/skill-creator/SKILL.md index b7f86598..15897970 100644 --- a/skills/skill-creator/SKILL.md +++ b/skills/skill-creator/SKILL.md @@ -53,7 +53,8 @@ skill-name/ ├── SKILL.md (required) │ ├── YAML frontmatter metadata (required) │ │ ├── name: (required) -│ │ └── description: (required) +│ │ ├── description: (required) +│ │ └── compatibility: (optional, rarely needed) │ └── Markdown instructions (required) └── Bundled Resources (optional) ├── scripts/ - Executable code (Python/Bash/etc.) @@ -65,7 +66,7 @@ skill-name/ Every SKILL.md consists of: -- **Frontmatter** (YAML): Contains `name` and `description` fields. These are the only fields that Claude reads to determine when the skill gets used, thus it is very important to be clear and comprehensive in describing what the skill is, and when it should be used. +- **Frontmatter** (YAML): Contains `name` and `description` fields (required), plus optional fields like `license`, `metadata`, and `compatibility`. Only `name` and `description` are read by Claude to determine when the skill triggers, so be clear and comprehensive about what the skill is and when it should be used. The `compatibility` field is for noting environment requirements (target product, system packages, etc.) but most skills don't need it. - **Body** (Markdown): Instructions and guidance for using the skill. Only loaded AFTER the skill triggers (if at all). #### Bundled Resources (optional) diff --git a/skills/skill-creator/scripts/init_skill.py b/skills/skill-creator/scripts/init_skill.py index 329ad4e5..c544fc72 100755 --- a/skills/skill-creator/scripts/init_skill.py +++ b/skills/skill-creator/scripts/init_skill.py @@ -274,9 +274,9 @@ def main(): if len(sys.argv) < 4 or sys.argv[2] != '--path': print("Usage: init_skill.py --path ") print("\nSkill name requirements:") - print(" - Hyphen-case identifier (e.g., 'data-analyzer')") + print(" - Kebab-case identifier (e.g., 'my-data-analyzer')") print(" - Lowercase letters, digits, and hyphens only") - print(" - Max 40 characters") + print(" - Max 64 characters") print(" - Must match directory name exactly") print("\nExamples:") print(" init_skill.py my-new-skill --path skills/public") diff --git a/skills/skill-creator/scripts/quick_validate.py b/skills/skill-creator/scripts/quick_validate.py index d9fbeb75..ed8e1ddd 100755 --- a/skills/skill-creator/scripts/quick_validate.py +++ b/skills/skill-creator/scripts/quick_validate.py @@ -39,7 +39,7 @@ def validate_skill(skill_path): return False, f"Invalid YAML in frontmatter: {e}" # Define allowed properties - ALLOWED_PROPERTIES = {'name', 'description', 'license', 'allowed-tools', 'metadata'} + ALLOWED_PROPERTIES = {'name', 'description', 'license', 'allowed-tools', 'metadata', 'compatibility'} # Check for unexpected properties (excluding nested keys under metadata) unexpected_keys = set(frontmatter.keys()) - ALLOWED_PROPERTIES @@ -61,9 +61,9 @@ def validate_skill(skill_path): return False, f"Name must be a string, got {type(name).__name__}" name = name.strip() if name: - # Check naming convention (hyphen-case: lowercase with hyphens) + # Check naming convention (kebab-case: lowercase with hyphens) if not re.match(r'^[a-z0-9-]+$', name): - return False, f"Name '{name}' should be hyphen-case (lowercase letters, digits, and hyphens only)" + return False, f"Name '{name}' should be kebab-case (lowercase letters, digits, and hyphens only)" if name.startswith('-') or name.endswith('-') or '--' in name: return False, f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens" # Check name length (max 64 characters per spec) @@ -83,6 +83,14 @@ def validate_skill(skill_path): if len(description) > 1024: return False, f"Description is too long ({len(description)} characters). Maximum is 1024 characters." + # Validate compatibility field if present (optional) + compatibility = frontmatter.get('compatibility', '') + if compatibility: + if not isinstance(compatibility, str): + return False, f"Compatibility must be a string, got {type(compatibility).__name__}" + if len(compatibility) > 500: + return False, f"Compatibility is too long ({len(compatibility)} characters). Maximum is 500 characters." + return True, "Skill is valid!" if __name__ == "__main__": diff --git a/skills/xlsx/scripts/recalc.py b/skills/xlsx/scripts/recalc.py old mode 100644 new mode 100755