[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7APM7PEMHDMZZF56MCPEXF3":3,"skill-same:01M7APM7PEMHDMZZF56MCPEXF3":49},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":29,"commitSha":30,"skillDirectory":5,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":34,"install":35,"resources":48},"01M7APM7PEMHDMZZF56MCPEXF3","skills-collection-manager",null,"Comprehensive toolkit for managing large Claude Code skill collections including bulk downloading from GitHub, organizing into categories, detecting and removing duplicates, consolidating skills, and maintaining clean skill repositories with 100+ skills.","davidanthonyn\u002Fagent-skills","davidanthonyn","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F55152980?v=4","01M7AJ4MY8S5C2RJCGX6626J0G","01M7AJ4MZB7EC7CAP27ANCSE7N",1,"MIT","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills-collection-manager\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: skills-collection-manager\ndescription: Comprehensive toolkit for managing large Claude Code skill collections including bulk downloading from GitHub, organizing into categories, detecting and removing duplicates, consolidating skills, and maintaining clean skill repositories with 100+ skills.\nlicense: MIT\ntags: [skills, collection-management, automation, organization, deduplication]\n---\n\n# Skills Collection Manager\n\nEfficiently manage, organize, and maintain large collections of Claude Code skills at scale.\n\n## Overview\n\nAs skill collections grow to hundreds of entries, manual management becomes impractical. This skill provides automated tools and workflows for:\n- Bulk downloading skills from GitHub repositories\n- Organizing skills into logical categories\n- Detecting and removing duplicates\n- Consolidating similar skills\n- Maintaining repository health\n- Generating documentation and indexes\n\n## When to Use\n\nUse this skill when:\n- Managing 50+ skills in a collection\n- Importing skills from multiple GitHub repositories\n- Organizing an unstructured skill directory\n- Identifying duplicate or redundant skills\n- Creating team-wide skill libraries\n- Maintaining organizational skill repositories\n- Building curated skill collections\n- Auditing skill quality and coverage\n\n## Directory Structure Patterns\n\n### Pattern 1: Flat Structure\n\n```\nskills\u002F\n├── docker-helper\u002F\n│   └── SKILL.md\n├── kubernetes-deploy\u002F\n│   └── SKILL.md\n├── postgres-optimization\u002F\n│   └── SKILL.md\n└── ...\n```\n\n**Pros**: Simple, easy to navigate\n**Cons**: Hard to manage at scale (100+ skills)\n\n### Pattern 2: Categorized Structure\n\n```\nskills\u002F\n├── automation\u002F\n│   ├── skill-harvester\u002F\n│   │   └── SKILL.md\n│   └── workflow-automation\u002F\n│       └── SKILL.md\n├── backend\u002F\n│   ├── api-design\u002F\n│   │   └── SKILL.md\n│   └── database-optimization\u002F\n│       └── SKILL.md\n├── devops\u002F\n│   ├── docker-optimization\u002F\n│   │   └── SKILL.md\n│   └── kubernetes-deploy\u002F\n│       └── SKILL.md\n└── ...\n```\n\n**Pros**: Organized, scalable\n**Cons**: Requires categorization logic\n\n### Pattern 3: Hybrid Structure\n\n```\nskills\u002F              # Flat for easy access\nskills-by-category\u002F  # Organized for browsing\nduplicates\u002F          # Quarantine area\narchived\u002F            # Old\u002Fdeprecated skills\n```\n\n**Pros**: Best of both worlds\n**Cons**: More complex to maintain\n\n## Bulk Skill Download\n\n### Download from GitHub Repository\n\n```bash\n#!\u002Fbin\u002Fbash\n# bulk-download-skills.sh - Download skills from GitHub repos\n\nREPOS_FILE=\"${1:-repos.txt}\"\nOUTPUT_DIR=\"downloaded-skills\"\nCHECKPOINT=\"download-checkpoint.txt\"\n\n# Create repos list if it doesn't exist\nif [ ! -f \"$REPOS_FILE\" ]; then\n    cat > \"$REPOS_FILE\" \u003C\u003C EOF\nhttps:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code-skills\nhttps:\u002F\u002Fgithub.com\u002Fuser\u002Fcustom-skills\nhttps:\u002F\u002Fgithub.com\u002Fteam\u002Fshared-skills\nEOF\n    echo \"Created example $REPOS_FILE - edit and run again\"\n    exit 0\nfi\n\nmkdir -p \"$OUTPUT_DIR\"\n\n# Process repos in batches\nwhile read -r repo_url; do\n    # Skip comments and empty lines\n    [[ \"$repo_url\" =~ ^# ]] && continue\n    [[ -z \"$repo_url\" ]] && continue\n\n    # Check if already downloaded\n    if grep -q \"$repo_url\" \"$CHECKPOINT\" 2>\u002Fdev\u002Fnull; then\n        echo \"✓ Skipping $repo_url (already downloaded)\"\n        continue\n    fi\n\n    echo \"=== Downloading: $repo_url ===\"\n\n    # Extract repo name\n    REPO_NAME=$(basename \"$repo_url\" .git)\n    TEMP_DIR=$(mktemp -d)\n\n    # Clone with timeout\n    if timeout 60s git clone --depth 1 \"$repo_url\" \"$TEMP_DIR\" 2>\u002Fdev\u002Fnull; then\n        # Find and copy skill files\n        SKILLS_FOUND=0\n\n        # Look for skills in common locations\n        for PATTERN in \"skills\u002F*\u002FSKILL.md\" \"skills\u002F**\u002Fskill.md\" \".claude\u002Fskills\u002F*\u002FSKILL.md\"; do\n            find \"$TEMP_DIR\" -path \"*\u002F$PATTERN\" 2>\u002Fdev\u002Fnull | while read skill_file; do\n                # Extract skill name (parent directory)\n                SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n                DEST_DIR=\"$OUTPUT_DIR\u002F${REPO_NAME}\u002F${SKILL_NAME}\"\n\n                mkdir -p \"$DEST_DIR\"\n                cp \"$skill_file\" \"$DEST_DIR\u002F\"\n\n                # Copy additional files if present\n                SKILL_DIR=$(dirname \"$skill_file\")\n                cp \"$SKILL_DIR\"\u002F*.md \"$DEST_DIR\u002F\" 2>\u002Fdev\u002Fnull || true\n                cp \"$SKILL_DIR\"\u002F*.yaml \"$DEST_DIR\u002F\" 2>\u002Fdev\u002Fnull || true\n                cp \"$SKILL_DIR\"\u002F*.json \"$DEST_DIR\u002F\" 2>\u002Fdev\u002Fnull || true\n\n                SKILLS_FOUND=$((SKILLS_FOUND + 1))\n                echo \"  ✓ Copied: $SKILL_NAME\"\n            done\n        done\n\n        if [ $SKILLS_FOUND -gt 0 ]; then\n            echo \"$repo_url\" >> \"$CHECKPOINT\"\n            echo \"✓ Downloaded $SKILLS_FOUND skills from $REPO_NAME\"\n        else\n            echo \"⚠️  No skills found in $REPO_NAME\"\n        fi\n\n        rm -rf \"$TEMP_DIR\"\n    else\n        echo \"✗ Failed to clone $repo_url\"\n    fi\n\n    echo \"\"\ndone \u003C \"$REPOS_FILE\"\n\n# Summary\nTOTAL_SKILLS=$(find \"$OUTPUT_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\necho \"=== Download Complete ===\"\necho \"Total skills downloaded: $TOTAL_SKILLS\"\necho \"Output directory: $OUTPUT_DIR\"\n```\n\n### Batch Download Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# download-top-repos.sh - Download skills from popular repositories\n\n# Top Claude Code skill repositories\nREPOS=(\n    \"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code-skills\"\n    \"https:\u002F\u002Fgithub.com\u002Fworks\u002Fclaude-code-skills\"\n    \"https:\u002F\u002Fgithub.com\u002Fjonbaker99\u002Fmy-claude-code-skills\"\n    \"https:\u002F\u002Fgithub.com\u002Fdiet103\u002Fmy_claude_skills\"\n    \"https:\u002F\u002Fgithub.com\u002Fmrgoonie\u002Fmy-claude-code-skills\"\n)\n\nBATCH_SIZE=5\nPROCESSED=0\n\nfor repo in \"${REPOS[@]}\"; do\n    echo \"$repo\" >> repos-batch.txt\n    PROCESSED=$((PROCESSED + 1))\n\n    # Process in batches to avoid timeouts\n    if [ $((PROCESSED % BATCH_SIZE)) -eq 0 ]; then\n        .\u002Fbulk-download-skills.sh repos-batch.txt\n        rm repos-batch.txt\n        echo \"Batch complete. Continuing...\"\n        sleep 2\n    fi\ndone\n\n# Process remaining\nif [ -f repos-batch.txt ]; then\n    .\u002Fbulk-download-skills.sh repos-batch.txt\n    rm repos-batch.txt\nfi\n```\n\n## Skill Organization\n\n### Auto-Categorization\n\n```bash\n#!\u002Fbin\u002Fbash\n# categorize-skills.sh - Auto-categorize skills based on content\n\nSKILLS_DIR=\"${1:-skills}\"\nOUTPUT_DIR=\"skills-by-category\"\n\n# Category mapping based on keywords\ndeclare -A CATEGORIES=(\n    [\"docker|container|kubernetes|k8s\"]=\"infrastructure\"\n    [\"api|endpoint|rest|graphql|backend\"]=\"backend\"\n    [\"react|vue|angular|frontend|ui|component\"]=\"frontend\"\n    [\"test|testing|jest|pytest|mocha\"]=\"testing\"\n    [\"ci|cd|deploy|github.action|jenkins\"]=\"devops\"\n    [\"database|postgres|mysql|mongodb|sql\"]=\"databases\"\n    [\"auth|authentication|jwt|oauth|security\"]=\"security\"\n    [\"aws|azure|gcp|cloud|serverless\"]=\"cloud\"\n    [\"python|javascript|typescript|golang|rust\"]=\"development\"\n    [\"doc|documentation|readme|markdown\"]=\"documentation\"\n)\n\nmkdir -p \"$OUTPUT_DIR\"\n\n# Process each skill\nfind \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | while read skill_file; do\n    SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n    SKILL_CONTENT=$(cat \"$skill_file\" | tr '[:upper:]' '[:lower:]')\n\n    echo \"Processing: $SKILL_NAME\"\n\n    # Try to match category\n    MATCHED_CATEGORY=\"\"\n    for pattern in \"${!CATEGORIES[@]}\"; do\n        if echo \"$SKILL_CONTENT\" | grep -qE \"$pattern\"; then\n            MATCHED_CATEGORY=\"${CATEGORIES[$pattern]}\"\n            break\n        fi\n    done\n\n    # Default category if no match\n    if [ -z \"$MATCHED_CATEGORY\" ]; then\n        MATCHED_CATEGORY=\"uncategorized\"\n    fi\n\n    # Copy to categorized directory\n    DEST_DIR=\"$OUTPUT_DIR\u002F$MATCHED_CATEGORY\u002F$SKILL_NAME\"\n    mkdir -p \"$DEST_DIR\"\n    cp -r \"$(dirname $skill_file)\"\u002F* \"$DEST_DIR\u002F\"\n\n    echo \"  → $MATCHED_CATEGORY\"\ndone\n\n# Generate summary\necho \"\"\necho \"=== Categorization Summary ===\"\nfor category_dir in \"$OUTPUT_DIR\"\u002F*; do\n    CATEGORY=$(basename \"$category_dir\")\n    COUNT=$(find \"$category_dir\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\n    printf \"%-20s : %3d skills\\n\" \"$CATEGORY\" \"$COUNT\"\ndone\n```\n\n### Manual Reorganization\n\n```bash\n#!\u002Fbin\u002Fbash\n# reorganize-skills.sh - Interactive skill reorganization\n\nSKILLS_DIR=\"skills\"\nCATEGORIES=(\"automation\" \"backend\" \"cloud\" \"data-engineering\" \"devops\" \"documentation\" \"frontend\" \"infrastructure\" \"security\" \"testing\")\n\n# Show uncategorized skills\necho \"=== Uncategorized Skills ===\"\nfind \"$SKILLS_DIR\" -maxdepth 1 -type d | tail -n +2 | while read skill_dir; do\n    SKILL_NAME=$(basename \"$skill_dir\")\n    echo \"- $SKILL_NAME\"\ndone\n\necho \"\"\necho \"Available categories:\"\nfor i in \"${!CATEGORIES[@]}\"; do\n    echo \"$((i+1))) ${CATEGORIES[$i]}\"\ndone\n\necho \"\"\nread -p \"Reorganize skills? (y\u002Fn) \" -n 1 -r\necho\n[[ ! $REPLY =~ ^[Yy]$ ]] && exit 0\n\nfind \"$SKILLS_DIR\" -maxdepth 1 -type d | tail -n +2 | while read skill_dir; do\n    SKILL_NAME=$(basename \"$skill_dir\")\n\n    echo \"\"\n    echo \"Skill: $SKILL_NAME\"\n    echo \"Description: $(grep -m 1 \"description:\" \"$skill_dir\u002FSKILL.md\" 2>\u002Fdev\u002Fnull | cut -d: -f2-)\"\n    echo \"\"\n\n    read -p \"Category (1-${#CATEGORIES[@]}, s=skip): \" choice\n\n    if [[ \"$choice\" =~ ^[0-9]+$ ]] && [ \"$choice\" -ge 1 ] && [ \"$choice\" -le \"${#CATEGORIES[@]}\" ]; then\n        CATEGORY=\"${CATEGORIES[$((choice-1))]}\"\n        DEST_DIR=\"skills-by-category\u002F$CATEGORY\u002F$SKILL_NAME\"\n\n        mkdir -p \"$DEST_DIR\"\n        mv \"$skill_dir\"\u002F* \"$DEST_DIR\u002F\"\n        rmdir \"$skill_dir\"\n\n        echo \"✓ Moved to $CATEGORY\"\n    fi\ndone\n```\n\n## Duplicate Detection\n\n### Simple Duplicate Finder\n\n```bash\n#!\u002Fbin\u002Fbash\n# find-duplicates.sh - Find duplicate skills\n\nSKILLS_DIR=\"${1:-skills}\"\nDUPLICATES_DIR=\"duplicates\"\n\nmkdir -p \"$DUPLICATES_DIR\"\n\n# Create temporary index\nTEMP_INDEX=$(mktemp)\n\n# Index all skills by normalized name\nfind \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | while read skill_file; do\n    SKILL_DIR=$(dirname \"$skill_file\")\n    SKILL_NAME=$(basename \"$SKILL_DIR\")\n\n    # Normalize name (remove variations)\n    NORMALIZED=$(echo \"$SKILL_NAME\" | tr '[:upper:]' '[:lower:]' | sed 's\u002F[-_]\u002F\u002Fg')\n\n    echo \"$NORMALIZED|$SKILL_DIR\" >> \"$TEMP_INDEX\"\ndone\n\n# Find duplicates\ncat \"$TEMP_INDEX\" | cut -d'|' -f1 | sort | uniq -d | while read dup_name; do\n    echo \"=== Duplicate: $dup_name ===\"\n\n    grep \"^$dup_name|\" \"$TEMP_INDEX\" | cut -d'|' -f2 | while read skill_dir; do\n        ORIGINAL_NAME=$(basename \"$skill_dir\")\n        echo \"  - $ORIGINAL_NAME\"\n\n        # Move to duplicates folder\n        DUP_DEST=\"$DUPLICATES_DIR\u002F$ORIGINAL_NAME\"\n        if [ ! -d \"$DUP_DEST\" ]; then\n            mv \"$skill_dir\" \"$DUP_DEST\"\n            echo \"    → Moved to $DUPLICATES_DIR\"\n        fi\n    done\n    echo \"\"\ndone\n\nrm \"$TEMP_INDEX\"\n\n# Summary\nDUP_COUNT=$(find \"$DUPLICATES_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\necho \"Found $DUP_COUNT potential duplicates in $DUPLICATES_DIR\"\necho \"Review and manually merge or delete\"\n```\n\n### Advanced Duplicate Detection (Content-based)\n\n```python\n#!\u002Fusr\u002Fbin\u002Fenv python3\n# detect-duplicates.py - Content-based duplicate detection\n\nimport os\nimport re\nfrom pathlib import Path\nfrom difflib import SequenceMatcher\nfrom collections import defaultdict\n\ndef normalize_content(content):\n    \"\"\"Normalize content for comparison\"\"\"\n    # Remove frontmatter\n    content = re.sub(r'^---.*?---', '', content, flags=re.DOTALL)\n    # Remove whitespace and lowercase\n    content = re.sub(r'\\s+', ' ', content.lower())\n    return content.strip()\n\ndef similarity_ratio(content1, content2):\n    \"\"\"Calculate similarity ratio between two contents\"\"\"\n    return SequenceMatcher(None, content1, content2).ratio()\n\ndef find_duplicates(skills_dir, threshold=0.8):\n    \"\"\"Find skills with similar content\"\"\"\n    skills = {}\n\n    # Read all skills\n    for skill_file in Path(skills_dir).rglob('SKILL.md'):\n        skill_name = skill_file.parent.name\n        with open(skill_file, 'r', encoding='utf-8') as f:\n            content = normalize_content(f.read())\n            skills[skill_name] = {\n                'content': content,\n                'path': str(skill_file.parent)\n            }\n\n    # Find duplicates\n    duplicates = defaultdict(list)\n    checked = set()\n\n    for name1, data1 in skills.items():\n        for name2, data2 in skills.items():\n            if name1 == name2 or (name1, name2) in checked:\n                continue\n\n            ratio = similarity_ratio(data1['content'], data2['content'])\n\n            if ratio >= threshold:\n                duplicates[name1].append({\n                    'name': name2,\n                    'similarity': ratio,\n                    'path': data2['path']\n                })\n\n            checked.add((name1, name2))\n            checked.add((name2, name1))\n\n    # Report findings\n    if duplicates:\n        print(\"=== Duplicate Skills Found ===\\n\")\n        for skill, dups in duplicates.items():\n            print(f\"{skill}:\")\n            for dup in dups:\n                print(f\"  - {dup['name']} ({dup['similarity']:.1%} similar)\")\n                print(f\"    Path: {dup['path']}\")\n            print()\n\n        print(f\"\\nTotal duplicate groups: {len(duplicates)}\")\n    else:\n        print(\"No duplicates found\")\n\nif __name__ == '__main__':\n    import sys\n    skills_dir = sys.argv[1] if len(sys.argv) > 1 else 'skills'\n    threshold = float(sys.argv[2]) if len(sys.argv) > 2 else 0.8\n\n    find_duplicates(skills_dir, threshold)\n```\n\n## Skill Consolidation\n\n### Merge Similar Skills\n\n```bash\n#!\u002Fbin\u002Fbash\n# consolidate-skills.sh - Merge similar skills\n\nSKILL1_DIR=\"$1\"\nSKILL2_DIR=\"$2\"\nOUTPUT_NAME=\"$3\"\n\nif [ -z \"$SKILL1_DIR\" ] || [ -z \"$SKILL2_DIR\" ] || [ -z \"$OUTPUT_NAME\" ]; then\n    echo \"Usage: $0 \u003Cskill1-dir> \u003Cskill2-dir> \u003Coutput-name>\"\n    exit 1\nfi\n\nOUTPUT_DIR=\"skills\u002F$OUTPUT_NAME\"\nmkdir -p \"$OUTPUT_DIR\"\n\n# Extract metadata from both skills\nSKILL1_NAME=$(grep \"^name:\" \"$SKILL1_DIR\u002FSKILL.md\" | cut -d: -f2 | xargs)\nSKILL2_NAME=$(grep \"^name:\" \"$SKILL2_DIR\u002FSKILL.md\" | cut -d: -f2 | xargs)\n\nDESC1=$(grep \"^description:\" \"$SKILL1_DIR\u002FSKILL.md\" | cut -d: -f2 | xargs)\nDESC2=$(grep \"^description:\" \"$SKILL2_DIR\u002FSKILL.md\" | cut -d: -f2 | xargs)\n\n# Create consolidated skill\ncat > \"$OUTPUT_DIR\u002FSKILL.md\" \u003C\u003C EOF\n---\nname: $OUTPUT_NAME\ndescription: Consolidated skill combining $SKILL1_NAME and $SKILL2_NAME\nconsolidated-from:\n  - $SKILL1_NAME\n  - $SKILL2_NAME\nlicense: MIT\n---\n\n# ${OUTPUT_NAME^}\n\nThis skill consolidates functionality from:\n- **$SKILL1_NAME**: $DESC1\n- **$SKILL2_NAME**: $DESC2\n\n## From $SKILL1_NAME\n\n$(sed -n '\u002F^# \u002F,$ p' \"$SKILL1_DIR\u002FSKILL.md\" | tail -n +2)\n\n---\n\n## From $SKILL2_NAME\n\n$(sed -n '\u002F^# \u002F,$ p' \"$SKILL2_DIR\u002FSKILL.md\" | tail -n +2)\n\n---\n\n## Combined Usage\n\nTODO: Add guidance on using consolidated functionality\n\nEOF\n\necho \"✓ Created consolidated skill: $OUTPUT_DIR\"\necho \"Review and edit: $OUTPUT_DIR\u002FSKILL.md\"\n```\n\n## Repository Maintenance\n\n### Health Check\n\n```bash\n#!\u002Fbin\u002Fbash\n# health-check.sh - Check repository health\n\nSKILLS_DIR=\"${1:-skills}\"\n\necho \"=== Skills Repository Health Check ===\"\necho \"\"\n\n# Count total skills\nTOTAL=$(find \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\necho \"Total skills: $TOTAL\"\necho \"\"\n\n# Check for required files\necho \"=== Missing Files ===\"\nMISSING=0\nfind \"$SKILLS_DIR\" -type d -mindepth 1 | while read skill_dir; do\n    if [ ! -f \"$skill_dir\u002FSKILL.md\" ] && [ ! -f \"$skill_dir\u002Fskill.md\" ]; then\n        echo \"✗ $(basename $skill_dir): No SKILL.md file\"\n        MISSING=$((MISSING + 1))\n    fi\ndone\n[ $MISSING -eq 0 ] && echo \"✓ All skills have SKILL.md files\"\necho \"\"\n\n# Check for metadata\necho \"=== Missing Metadata ===\"\nfind \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | while read skill_file; do\n    SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n\n    # Check for required frontmatter\n    if ! grep -q \"^name:\" \"$skill_file\"; then\n        echo \"✗ $SKILL_NAME: Missing 'name' in frontmatter\"\n    fi\n\n    if ! grep -q \"^description:\" \"$skill_file\"; then\n        echo \"✗ $SKILL_NAME: Missing 'description' in frontmatter\"\n    fi\ndone\necho \"\"\n\n# Check for empty files\necho \"=== Empty Skills ===\"\nfind \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | while read skill_file; do\n    if [ ! -s \"$skill_file\" ]; then\n        echo \"✗ $(basename $(dirname $skill_file)): Empty file\"\n    fi\ndone\necho \"\"\n\n# Check naming conventions\necho \"=== Naming Convention Issues ===\"\nfind \"$SKILLS_DIR\" -type d -mindepth 1 | while read skill_dir; do\n    SKILL_NAME=$(basename \"$skill_dir\")\n\n    # Check for kebab-case\n    if ! echo \"$SKILL_NAME\" | grep -qE '^[a-z0-9]+(-[a-z0-9]+)*$'; then\n        echo \"⚠️  $SKILL_NAME: Not in kebab-case format\"\n    fi\ndone\necho \"\"\n\necho \"=== Health Check Complete ===\"\n```\n\n### Generate Documentation\n\n```bash\n#!\u002Fbin\u002Fbash\n# generate-docs.sh - Generate skill collection documentation\n\nSKILLS_DIR=\"${1:-skills}\"\nOUTPUT_FILE=\"SKILLS_COLLECTION_README.md\"\n\ncat > \"$OUTPUT_FILE\" \u003C\u003C EOF\n# Skills Collection\n\nAuto-generated documentation for skill collection.\n\n**Last Updated**: $(date +\"%Y-%m-%d\")\n**Total Skills**: $(find \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\n\n## Skills by Category\n\nEOF\n\n# Group by category (if using categorized structure)\nif [ -d \"skills-by-category\" ]; then\n    for category_dir in skills-by-category\u002F*; do\n        CATEGORY=$(basename \"$category_dir\")\n        COUNT=$(find \"$category_dir\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\n\n        echo \"### ${CATEGORY^} ($COUNT)\" >> \"$OUTPUT_FILE\"\n        echo \"\" >> \"$OUTPUT_FILE\"\n\n        find \"$category_dir\" -name \"SKILL.md\" -o -name \"skill.md\" | sort | while read skill_file; do\n            SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n            DESC=$(grep \"^description:\" \"$skill_file\" | cut -d: -f2- | xargs)\n\n            echo \"- **$SKILL_NAME**: $DESC\" >> \"$OUTPUT_FILE\"\n        done\n\n        echo \"\" >> \"$OUTPUT_FILE\"\n    done\nelse\n    # Flat structure\n    find \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | sort | while read skill_file; do\n        SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n        DESC=$(grep \"^description:\" \"$skill_file\" | cut -d: -f2- | xargs)\n\n        echo \"- **$SKILL_NAME**: $DESC\" >> \"$OUTPUT_FILE\"\n    done\nfi\n\necho \"✓ Generated: $OUTPUT_FILE\"\n```\n\n## Best Practices\n\n### ✅ DO\n\n1. **Categorize consistently** - Use standard categories across team\n2. **Check for duplicates** regularly before adding new skills\n3. **Maintain metadata** - Ensure all skills have proper frontmatter\n4. **Document changes** - Keep CHANGELOG or version history\n5. **Use naming conventions** - kebab-case for all skill names\n6. **Version control** - Commit frequently with clear messages\n7. **Test skills** - Verify skills work before adding to collection\n8. **Review regularly** - Audit collection health monthly\n\n### ❌ DON'T\n\n1. **Don't mix formats** - Keep consistent SKILL.md naming\n2. **Don't duplicate** - Search before creating new skills\n3. **Don't leave orphans** - Remove skills properly (don't just delete files)\n4. **Don't skip descriptions** - Every skill needs clear description\n5. **Don't over-categorize** - Keep category tree shallow (1-2 levels)\n6. **Don't hoard** - Archive or delete truly obsolete skills\n7. **Don't ignore errors** - Fix health check issues promptly\n\n## Workflows\n\n### Weekly Maintenance\n\n```bash\n#!\u002Fbin\u002Fbash\n# weekly-maintenance.sh\n\necho \"=== Weekly Skills Collection Maintenance ===\"\n\n# 1. Health check\n.\u002Fhealth-check.sh skills\n\n# 2. Find duplicates\n.\u002Ffind-duplicates.sh skills\n\n# 3. Update documentation\n.\u002Fgenerate-docs.sh skills\n\n# 4. Commit changes\ngit add .\ngit commit -m \"chore: Weekly skills collection maintenance\"\n\necho \"✓ Maintenance complete\"\n```\n\n### New Skills Integration\n\n```bash\n#!\u002Fbin\u002Fbash\n# integrate-new-skills.sh\n\nNEW_SKILLS_DIR=\"$1\"\n\n# 1. Check for duplicates against existing\necho \"Checking for duplicates...\"\n# ... duplicate check logic ...\n\n# 2. Auto-categorize\necho \"Categorizing new skills...\"\n.\u002Fcategorize-skills.sh \"$NEW_SKILLS_DIR\"\n\n# 3. Move to main collection\necho \"Integrating into collection...\"\ncp -r \"$NEW_SKILLS_DIR\"\u002F* skills\u002F\n\n# 4. Update docs\n.\u002Fgenerate-docs.sh\n\necho \"✓ Integration complete\"\n```\n\n---\n\n**Version**: 1.0.0\n**Author**: Harvested from your_claude_skills repository (270+ skills managed)\n**Last Updated**: 2025-11-18\n**License**: MIT\n\n## Quick Reference\n\n```bash\n# Download skills from GitHub repos\n.\u002Fbulk-download-skills.sh repos.txt\n\n# Auto-categorize skills\n.\u002Fcategorize-skills.sh skills\u002F\n\n# Find duplicates\n.\u002Ffind-duplicates.sh skills\u002F\n\n# Run health check\n.\u002Fhealth-check.sh skills\u002F\n\n# Generate documentation\n.\u002Fgenerate-docs.sh skills\u002F\n\n# Weekly maintenance\n.\u002Fweekly-maintenance.sh\n```\n\nScale your skill collection management with confidence! 📚\n","# Skills Collection Manager\n\nEfficiently manage, organize, and maintain large collections of Claude Code skills at scale.\n\n## Overview\n\nAs skill collections grow to hundreds of entries, manual management becomes impractical. This skill provides automated tools and workflows for:\n- Bulk downloading skills from GitHub repositories\n- Organizing skills into logical categories\n- Detecting and removing duplicates\n- Consolidating similar skills\n- Maintaining repository health\n- Generating documentation and indexes\n\n## When to Use\n\nUse this skill when:\n- Managing 50+ skills in a collection\n- Importing skills from multiple GitHub repositories\n- Organizing an unstructured skill directory\n- Identifying duplicate or redundant skills\n- Creating team-wide skill libraries\n- Maintaining organizational skill repositories\n- Building curated skill collections\n- Auditing skill quality and coverage\n\n## Directory Structure Patterns\n\n### Pattern 1: Flat Structure\n\n```\nskills\u002F\n├── docker-helper\u002F\n│   └── SKILL.md\n├── kubernetes-deploy\u002F\n│   └── SKILL.md\n├── postgres-optimization\u002F\n│   └── SKILL.md\n└── ...\n```\n\n**Pros**: Simple, easy to navigate\n**Cons**: Hard to manage at scale (100+ skills)\n\n### Pattern 2: Categorized Structure\n\n```\nskills\u002F\n├── automation\u002F\n│   ├── skill-harvester\u002F\n│   │   └── SKILL.md\n│   └── workflow-automation\u002F\n│       └── SKILL.md\n├── backend\u002F\n│   ├── api-design\u002F\n│   │   └── SKILL.md\n│   └── database-optimization\u002F\n│       └── SKILL.md\n├── devops\u002F\n│   ├── docker-optimization\u002F\n│   │   └── SKILL.md\n│   └── kubernetes-deploy\u002F\n│       └── SKILL.md\n└── ...\n```\n\n**Pros**: Organized, scalable\n**Cons**: Requires categorization logic\n\n### Pattern 3: Hybrid Structure\n\n```\nskills\u002F              # Flat for easy access\nskills-by-category\u002F  # Organized for browsing\nduplicates\u002F          # Quarantine area\narchived\u002F            # Old\u002Fdeprecated skills\n```\n\n**Pros**: Best of both worlds\n**Cons**: More complex to maintain\n\n## Bulk Skill Download\n\n### Download from GitHub Repository\n\n```bash\n#!\u002Fbin\u002Fbash\n# bulk-download-skills.sh - Download skills from GitHub repos\n\nREPOS_FILE=\"${1:-repos.txt}\"\nOUTPUT_DIR=\"downloaded-skills\"\nCHECKPOINT=\"download-checkpoint.txt\"\n\n# Create repos list if it doesn't exist\nif [ ! -f \"$REPOS_FILE\" ]; then\n    cat > \"$REPOS_FILE\" \u003C\u003C EOF\nhttps:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code-skills\nhttps:\u002F\u002Fgithub.com\u002Fuser\u002Fcustom-skills\nhttps:\u002F\u002Fgithub.com\u002Fteam\u002Fshared-skills\nEOF\n    echo \"Created example $REPOS_FILE - edit and run again\"\n    exit 0\nfi\n\nmkdir -p \"$OUTPUT_DIR\"\n\n# Process repos in batches\nwhile read -r repo_url; do\n    # Skip comments and empty lines\n    [[ \"$repo_url\" =~ ^# ]] && continue\n    [[ -z \"$repo_url\" ]] && continue\n\n    # Check if already downloaded\n    if grep -q \"$repo_url\" \"$CHECKPOINT\" 2>\u002Fdev\u002Fnull; then\n        echo \"✓ Skipping $repo_url (already downloaded)\"\n        continue\n    fi\n\n    echo \"=== Downloading: $repo_url ===\"\n\n    # Extract repo name\n    REPO_NAME=$(basename \"$repo_url\" .git)\n    TEMP_DIR=$(mktemp -d)\n\n    # Clone with timeout\n    if timeout 60s git clone --depth 1 \"$repo_url\" \"$TEMP_DIR\" 2>\u002Fdev\u002Fnull; then\n        # Find and copy skill files\n        SKILLS_FOUND=0\n\n        # Look for skills in common locations\n        for PATTERN in \"skills\u002F*\u002FSKILL.md\" \"skills\u002F**\u002Fskill.md\" \".claude\u002Fskills\u002F*\u002FSKILL.md\"; do\n            find \"$TEMP_DIR\" -path \"*\u002F$PATTERN\" 2>\u002Fdev\u002Fnull | while read skill_file; do\n                # Extract skill name (parent directory)\n                SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n                DEST_DIR=\"$OUTPUT_DIR\u002F${REPO_NAME}\u002F${SKILL_NAME}\"\n\n                mkdir -p \"$DEST_DIR\"\n                cp \"$skill_file\" \"$DEST_DIR\u002F\"\n\n                # Copy additional files if present\n                SKILL_DIR=$(dirname \"$skill_file\")\n                cp \"$SKILL_DIR\"\u002F*.md \"$DEST_DIR\u002F\" 2>\u002Fdev\u002Fnull || true\n                cp \"$SKILL_DIR\"\u002F*.yaml \"$DEST_DIR\u002F\" 2>\u002Fdev\u002Fnull || true\n                cp \"$SKILL_DIR\"\u002F*.json \"$DEST_DIR\u002F\" 2>\u002Fdev\u002Fnull || true\n\n                SKILLS_FOUND=$((SKILLS_FOUND + 1))\n                echo \"  ✓ Copied: $SKILL_NAME\"\n            done\n        done\n\n        if [ $SKILLS_FOUND -gt 0 ]; then\n            echo \"$repo_url\" >> \"$CHECKPOINT\"\n            echo \"✓ Downloaded $SKILLS_FOUND skills from $REPO_NAME\"\n        else\n            echo \"⚠️  No skills found in $REPO_NAME\"\n        fi\n\n        rm -rf \"$TEMP_DIR\"\n    else\n        echo \"✗ Failed to clone $repo_url\"\n    fi\n\n    echo \"\"\ndone \u003C \"$REPOS_FILE\"\n\n# Summary\nTOTAL_SKILLS=$(find \"$OUTPUT_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\necho \"=== Download Complete ===\"\necho \"Total skills downloaded: $TOTAL_SKILLS\"\necho \"Output directory: $OUTPUT_DIR\"\n```\n\n### Batch Download Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# download-top-repos.sh - Download skills from popular repositories\n\n# Top Claude Code skill repositories\nREPOS=(\n    \"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code-skills\"\n    \"https:\u002F\u002Fgithub.com\u002Fworks\u002Fclaude-code-skills\"\n    \"https:\u002F\u002Fgithub.com\u002Fjonbaker99\u002Fmy-claude-code-skills\"\n    \"https:\u002F\u002Fgithub.com\u002Fdiet103\u002Fmy_claude_skills\"\n    \"https:\u002F\u002Fgithub.com\u002Fmrgoonie\u002Fmy-claude-code-skills\"\n)\n\nBATCH_SIZE=5\nPROCESSED=0\n\nfor repo in \"${REPOS[@]}\"; do\n    echo \"$repo\" >> repos-batch.txt\n    PROCESSED=$((PROCESSED + 1))\n\n    # Process in batches to avoid timeouts\n    if [ $((PROCESSED % BATCH_SIZE)) -eq 0 ]; then\n        .\u002Fbulk-download-skills.sh repos-batch.txt\n        rm repos-batch.txt\n        echo \"Batch complete. Continuing...\"\n        sleep 2\n    fi\ndone\n\n# Process remaining\nif [ -f repos-batch.txt ]; then\n    .\u002Fbulk-download-skills.sh repos-batch.txt\n    rm repos-batch.txt\nfi\n```\n\n## Skill Organization\n\n### Auto-Categorization\n\n```bash\n#!\u002Fbin\u002Fbash\n# categorize-skills.sh - Auto-categorize skills based on content\n\nSKILLS_DIR=\"${1:-skills}\"\nOUTPUT_DIR=\"skills-by-category\"\n\n# Category mapping based on keywords\ndeclare -A CATEGORIES=(\n    [\"docker|container|kubernetes|k8s\"]=\"infrastructure\"\n    [\"api|endpoint|rest|graphql|backend\"]=\"backend\"\n    [\"react|vue|angular|frontend|ui|component\"]=\"frontend\"\n    [\"test|testing|jest|pytest|mocha\"]=\"testing\"\n    [\"ci|cd|deploy|github.action|jenkins\"]=\"devops\"\n    [\"database|postgres|mysql|mongodb|sql\"]=\"databases\"\n    [\"auth|authentication|jwt|oauth|security\"]=\"security\"\n    [\"aws|azure|gcp|cloud|serverless\"]=\"cloud\"\n    [\"python|javascript|typescript|golang|rust\"]=\"development\"\n    [\"doc|documentation|readme|markdown\"]=\"documentation\"\n)\n\nmkdir -p \"$OUTPUT_DIR\"\n\n# Process each skill\nfind \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | while read skill_file; do\n    SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n    SKILL_CONTENT=$(cat \"$skill_file\" | tr '[:upper:]' '[:lower:]')\n\n    echo \"Processing: $SKILL_NAME\"\n\n    # Try to match category\n    MATCHED_CATEGORY=\"\"\n    for pattern in \"${!CATEGORIES[@]}\"; do\n        if echo \"$SKILL_CONTENT\" | grep -qE \"$pattern\"; then\n            MATCHED_CATEGORY=\"${CATEGORIES[$pattern]}\"\n            break\n        fi\n    done\n\n    # Default category if no match\n    if [ -z \"$MATCHED_CATEGORY\" ]; then\n        MATCHED_CATEGORY=\"uncategorized\"\n    fi\n\n    # Copy to categorized directory\n    DEST_DIR=\"$OUTPUT_DIR\u002F$MATCHED_CATEGORY\u002F$SKILL_NAME\"\n    mkdir -p \"$DEST_DIR\"\n    cp -r \"$(dirname $skill_file)\"\u002F* \"$DEST_DIR\u002F\"\n\n    echo \"  → $MATCHED_CATEGORY\"\ndone\n\n# Generate summary\necho \"\"\necho \"=== Categorization Summary ===\"\nfor category_dir in \"$OUTPUT_DIR\"\u002F*; do\n    CATEGORY=$(basename \"$category_dir\")\n    COUNT=$(find \"$category_dir\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\n    printf \"%-20s : %3d skills\\n\" \"$CATEGORY\" \"$COUNT\"\ndone\n```\n\n### Manual Reorganization\n\n```bash\n#!\u002Fbin\u002Fbash\n# reorganize-skills.sh - Interactive skill reorganization\n\nSKILLS_DIR=\"skills\"\nCATEGORIES=(\"automation\" \"backend\" \"cloud\" \"data-engineering\" \"devops\" \"documentation\" \"frontend\" \"infrastructure\" \"security\" \"testing\")\n\n# Show uncategorized skills\necho \"=== Uncategorized Skills ===\"\nfind \"$SKILLS_DIR\" -maxdepth 1 -type d | tail -n +2 | while read skill_dir; do\n    SKILL_NAME=$(basename \"$skill_dir\")\n    echo \"- $SKILL_NAME\"\ndone\n\necho \"\"\necho \"Available categories:\"\nfor i in \"${!CATEGORIES[@]}\"; do\n    echo \"$((i+1))) ${CATEGORIES[$i]}\"\ndone\n\necho \"\"\nread -p \"Reorganize skills? (y\u002Fn) \" -n 1 -r\necho\n[[ ! $REPLY =~ ^[Yy]$ ]] && exit 0\n\nfind \"$SKILLS_DIR\" -maxdepth 1 -type d | tail -n +2 | while read skill_dir; do\n    SKILL_NAME=$(basename \"$skill_dir\")\n\n    echo \"\"\n    echo \"Skill: $SKILL_NAME\"\n    echo \"Description: $(grep -m 1 \"description:\" \"$skill_dir\u002FSKILL.md\" 2>\u002Fdev\u002Fnull | cut -d: -f2-)\"\n    echo \"\"\n\n    read -p \"Category (1-${#CATEGORIES[@]}, s=skip): \" choice\n\n    if [[ \"$choice\" =~ ^[0-9]+$ ]] && [ \"$choice\" -ge 1 ] && [ \"$choice\" -le \"${#CATEGORIES[@]}\" ]; then\n        CATEGORY=\"${CATEGORIES[$((choice-1))]}\"\n        DEST_DIR=\"skills-by-category\u002F$CATEGORY\u002F$SKILL_NAME\"\n\n        mkdir -p \"$DEST_DIR\"\n        mv \"$skill_dir\"\u002F* \"$DEST_DIR\u002F\"\n        rmdir \"$skill_dir\"\n\n        echo \"✓ Moved to $CATEGORY\"\n    fi\ndone\n```\n\n## Duplicate Detection\n\n### Simple Duplicate Finder\n\n```bash\n#!\u002Fbin\u002Fbash\n# find-duplicates.sh - Find duplicate skills\n\nSKILLS_DIR=\"${1:-skills}\"\nDUPLICATES_DIR=\"duplicates\"\n\nmkdir -p \"$DUPLICATES_DIR\"\n\n# Create temporary index\nTEMP_INDEX=$(mktemp)\n\n# Index all skills by normalized name\nfind \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | while read skill_file; do\n    SKILL_DIR=$(dirname \"$skill_file\")\n    SKILL_NAME=$(basename \"$SKILL_DIR\")\n\n    # Normalize name (remove variations)\n    NORMALIZED=$(echo \"$SKILL_NAME\" | tr '[:upper:]' '[:lower:]' | sed 's\u002F[-_]\u002F\u002Fg')\n\n    echo \"$NORMALIZED|$SKILL_DIR\" >> \"$TEMP_INDEX\"\ndone\n\n# Find duplicates\ncat \"$TEMP_INDEX\" | cut -d'|' -f1 | sort | uniq -d | while read dup_name; do\n    echo \"=== Duplicate: $dup_name ===\"\n\n    grep \"^$dup_name|\" \"$TEMP_INDEX\" | cut -d'|' -f2 | while read skill_dir; do\n        ORIGINAL_NAME=$(basename \"$skill_dir\")\n        echo \"  - $ORIGINAL_NAME\"\n\n        # Move to duplicates folder\n        DUP_DEST=\"$DUPLICATES_DIR\u002F$ORIGINAL_NAME\"\n        if [ ! -d \"$DUP_DEST\" ]; then\n            mv \"$skill_dir\" \"$DUP_DEST\"\n            echo \"    → Moved to $DUPLICATES_DIR\"\n        fi\n    done\n    echo \"\"\ndone\n\nrm \"$TEMP_INDEX\"\n\n# Summary\nDUP_COUNT=$(find \"$DUPLICATES_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\necho \"Found $DUP_COUNT potential duplicates in $DUPLICATES_DIR\"\necho \"Review and manually merge or delete\"\n```\n\n### Advanced Duplicate Detection (Content-based)\n\n```python\n#!\u002Fusr\u002Fbin\u002Fenv python3\n# detect-duplicates.py - Content-based duplicate detection\n\nimport os\nimport re\nfrom pathlib import Path\nfrom difflib import SequenceMatcher\nfrom collections import defaultdict\n\ndef normalize_content(content):\n    \"\"\"Normalize content for comparison\"\"\"\n    # Remove frontmatter\n    content = re.sub(r'^---.*?---', '', content, flags=re.DOTALL)\n    # Remove whitespace and lowercase\n    content = re.sub(r'\\s+', ' ', content.lower())\n    return content.strip()\n\ndef similarity_ratio(content1, content2):\n    \"\"\"Calculate similarity ratio between two contents\"\"\"\n    return SequenceMatcher(None, content1, content2).ratio()\n\ndef find_duplicates(skills_dir, threshold=0.8):\n    \"\"\"Find skills with similar content\"\"\"\n    skills = {}\n\n    # Read all skills\n    for skill_file in Path(skills_dir).rglob('SKILL.md'):\n        skill_name = skill_file.parent.name\n        with open(skill_file, 'r', encoding='utf-8') as f:\n            content = normalize_content(f.read())\n            skills[skill_name] = {\n                'content': content,\n                'path': str(skill_file.parent)\n            }\n\n    # Find duplicates\n    duplicates = defaultdict(list)\n    checked = set()\n\n    for name1, data1 in skills.items():\n        for name2, data2 in skills.items():\n            if name1 == name2 or (name1, name2) in checked:\n                continue\n\n            ratio = similarity_ratio(data1['content'], data2['content'])\n\n            if ratio >= threshold:\n                duplicates[name1].append({\n                    'name': name2,\n                    'similarity': ratio,\n                    'path': data2['path']\n                })\n\n            checked.add((name1, name2))\n            checked.add((name2, name1))\n\n    # Report findings\n    if duplicates:\n        print(\"=== Duplicate Skills Found ===\\n\")\n        for skill, dups in duplicates.items():\n            print(f\"{skill}:\")\n            for dup in dups:\n                print(f\"  - {dup['name']} ({dup['similarity']:.1%} similar)\")\n                print(f\"    Path: {dup['path']}\")\n            print()\n\n        print(f\"\\nTotal duplicate groups: {len(duplicates)}\")\n    else:\n        print(\"No duplicates found\")\n\nif __name__ == '__main__':\n    import sys\n    skills_dir = sys.argv[1] if len(sys.argv) > 1 else 'skills'\n    threshold = float(sys.argv[2]) if len(sys.argv) > 2 else 0.8\n\n    find_duplicates(skills_dir, threshold)\n```\n\n## Skill Consolidation\n\n### Merge Similar Skills\n\n```bash\n#!\u002Fbin\u002Fbash\n# consolidate-skills.sh - Merge similar skills\n\nSKILL1_DIR=\"$1\"\nSKILL2_DIR=\"$2\"\nOUTPUT_NAME=\"$3\"\n\nif [ -z \"$SKILL1_DIR\" ] || [ -z \"$SKILL2_DIR\" ] || [ -z \"$OUTPUT_NAME\" ]; then\n    echo \"Usage: $0 \u003Cskill1-dir> \u003Cskill2-dir> \u003Coutput-name>\"\n    exit 1\nfi\n\nOUTPUT_DIR=\"skills\u002F$OUTPUT_NAME\"\nmkdir -p \"$OUTPUT_DIR\"\n\n# Extract metadata from both skills\nSKILL1_NAME=$(grep \"^name:\" \"$SKILL1_DIR\u002FSKILL.md\" | cut -d: -f2 | xargs)\nSKILL2_NAME=$(grep \"^name:\" \"$SKILL2_DIR\u002FSKILL.md\" | cut -d: -f2 | xargs)\n\nDESC1=$(grep \"^description:\" \"$SKILL1_DIR\u002FSKILL.md\" | cut -d: -f2 | xargs)\nDESC2=$(grep \"^description:\" \"$SKILL2_DIR\u002FSKILL.md\" | cut -d: -f2 | xargs)\n\n# Create consolidated skill\ncat > \"$OUTPUT_DIR\u002FSKILL.md\" \u003C\u003C EOF\n---\nname: $OUTPUT_NAME\ndescription: Consolidated skill combining $SKILL1_NAME and $SKILL2_NAME\nconsolidated-from:\n  - $SKILL1_NAME\n  - $SKILL2_NAME\nlicense: MIT\n---\n\n# ${OUTPUT_NAME^}\n\nThis skill consolidates functionality from:\n- **$SKILL1_NAME**: $DESC1\n- **$SKILL2_NAME**: $DESC2\n\n## From $SKILL1_NAME\n\n$(sed -n '\u002F^# \u002F,$ p' \"$SKILL1_DIR\u002FSKILL.md\" | tail -n +2)\n\n---\n\n## From $SKILL2_NAME\n\n$(sed -n '\u002F^# \u002F,$ p' \"$SKILL2_DIR\u002FSKILL.md\" | tail -n +2)\n\n---\n\n## Combined Usage\n\nTODO: Add guidance on using consolidated functionality\n\nEOF\n\necho \"✓ Created consolidated skill: $OUTPUT_DIR\"\necho \"Review and edit: $OUTPUT_DIR\u002FSKILL.md\"\n```\n\n## Repository Maintenance\n\n### Health Check\n\n```bash\n#!\u002Fbin\u002Fbash\n# health-check.sh - Check repository health\n\nSKILLS_DIR=\"${1:-skills}\"\n\necho \"=== Skills Repository Health Check ===\"\necho \"\"\n\n# Count total skills\nTOTAL=$(find \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\necho \"Total skills: $TOTAL\"\necho \"\"\n\n# Check for required files\necho \"=== Missing Files ===\"\nMISSING=0\nfind \"$SKILLS_DIR\" -type d -mindepth 1 | while read skill_dir; do\n    if [ ! -f \"$skill_dir\u002FSKILL.md\" ] && [ ! -f \"$skill_dir\u002Fskill.md\" ]; then\n        echo \"✗ $(basename $skill_dir): No SKILL.md file\"\n        MISSING=$((MISSING + 1))\n    fi\ndone\n[ $MISSING -eq 0 ] && echo \"✓ All skills have SKILL.md files\"\necho \"\"\n\n# Check for metadata\necho \"=== Missing Metadata ===\"\nfind \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | while read skill_file; do\n    SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n\n    # Check for required frontmatter\n    if ! grep -q \"^name:\" \"$skill_file\"; then\n        echo \"✗ $SKILL_NAME: Missing 'name' in frontmatter\"\n    fi\n\n    if ! grep -q \"^description:\" \"$skill_file\"; then\n        echo \"✗ $SKILL_NAME: Missing 'description' in frontmatter\"\n    fi\ndone\necho \"\"\n\n# Check for empty files\necho \"=== Empty Skills ===\"\nfind \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | while read skill_file; do\n    if [ ! -s \"$skill_file\" ]; then\n        echo \"✗ $(basename $(dirname $skill_file)): Empty file\"\n    fi\ndone\necho \"\"\n\n# Check naming conventions\necho \"=== Naming Convention Issues ===\"\nfind \"$SKILLS_DIR\" -type d -mindepth 1 | while read skill_dir; do\n    SKILL_NAME=$(basename \"$skill_dir\")\n\n    # Check for kebab-case\n    if ! echo \"$SKILL_NAME\" | grep -qE '^[a-z0-9]+(-[a-z0-9]+)*$'; then\n        echo \"⚠️  $SKILL_NAME: Not in kebab-case format\"\n    fi\ndone\necho \"\"\n\necho \"=== Health Check Complete ===\"\n```\n\n### Generate Documentation\n\n```bash\n#!\u002Fbin\u002Fbash\n# generate-docs.sh - Generate skill collection documentation\n\nSKILLS_DIR=\"${1:-skills}\"\nOUTPUT_FILE=\"SKILLS_COLLECTION_README.md\"\n\ncat > \"$OUTPUT_FILE\" \u003C\u003C EOF\n# Skills Collection\n\nAuto-generated documentation for skill collection.\n\n**Last Updated**: $(date +\"%Y-%m-%d\")\n**Total Skills**: $(find \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\n\n## Skills by Category\n\nEOF\n\n# Group by category (if using categorized structure)\nif [ -d \"skills-by-category\" ]; then\n    for category_dir in skills-by-category\u002F*; do\n        CATEGORY=$(basename \"$category_dir\")\n        COUNT=$(find \"$category_dir\" -name \"SKILL.md\" -o -name \"skill.md\" | wc -l)\n\n        echo \"### ${CATEGORY^} ($COUNT)\" >> \"$OUTPUT_FILE\"\n        echo \"\" >> \"$OUTPUT_FILE\"\n\n        find \"$category_dir\" -name \"SKILL.md\" -o -name \"skill.md\" | sort | while read skill_file; do\n            SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n            DESC=$(grep \"^description:\" \"$skill_file\" | cut -d: -f2- | xargs)\n\n            echo \"- **$SKILL_NAME**: $DESC\" >> \"$OUTPUT_FILE\"\n        done\n\n        echo \"\" >> \"$OUTPUT_FILE\"\n    done\nelse\n    # Flat structure\n    find \"$SKILLS_DIR\" -name \"SKILL.md\" -o -name \"skill.md\" | sort | while read skill_file; do\n        SKILL_NAME=$(basename $(dirname \"$skill_file\"))\n        DESC=$(grep \"^description:\" \"$skill_file\" | cut -d: -f2- | xargs)\n\n        echo \"- **$SKILL_NAME**: $DESC\" >> \"$OUTPUT_FILE\"\n    done\nfi\n\necho \"✓ Generated: $OUTPUT_FILE\"\n```\n\n## Best Practices\n\n### ✅ DO\n\n1. **Categorize consistently** - Use standard categories across team\n2. **Check for duplicates** regularly before adding new skills\n3. **Maintain metadata** - Ensure all skills have proper frontmatter\n4. **Document changes** - Keep CHANGELOG or version history\n5. **Use naming conventions** - kebab-case for all skill names\n6. **Version control** - Commit frequently with clear messages\n7. **Test skills** - Verify skills work before adding to collection\n8. **Review regularly** - Audit collection health monthly\n\n### ❌ DON'T\n\n1. **Don't mix formats** - Keep consistent SKILL.md naming\n2. **Don't duplicate** - Search before creating new skills\n3. **Don't leave orphans** - Remove skills properly (don't just delete files)\n4. **Don't skip descriptions** - Every skill needs clear description\n5. **Don't over-categorize** - Keep category tree shallow (1-2 levels)\n6. **Don't hoard** - Archive or delete truly obsolete skills\n7. **Don't ignore errors** - Fix health check issues promptly\n\n## Workflows\n\n### Weekly Maintenance\n\n```bash\n#!\u002Fbin\u002Fbash\n# weekly-maintenance.sh\n\necho \"=== Weekly Skills Collection Maintenance ===\"\n\n# 1. Health check\n.\u002Fhealth-check.sh skills\n\n# 2. Find duplicates\n.\u002Ffind-duplicates.sh skills\n\n# 3. Update documentation\n.\u002Fgenerate-docs.sh skills\n\n# 4. Commit changes\ngit add .\ngit commit -m \"chore: Weekly skills collection maintenance\"\n\necho \"✓ Maintenance complete\"\n```\n\n### New Skills Integration\n\n```bash\n#!\u002Fbin\u002Fbash\n# integrate-new-skills.sh\n\nNEW_SKILLS_DIR=\"$1\"\n\n# 1. Check for duplicates against existing\necho \"Checking for duplicates...\"\n# ... duplicate check logic ...\n\n# 2. Auto-categorize\necho \"Categorizing new skills...\"\n.\u002Fcategorize-skills.sh \"$NEW_SKILLS_DIR\"\n\n# 3. Move to main collection\necho \"Integrating into collection...\"\ncp -r \"$NEW_SKILLS_DIR\"\u002F* skills\u002F\n\n# 4. Update docs\n.\u002Fgenerate-docs.sh\n\necho \"✓ Integration complete\"\n```\n\n---\n\n**Version**: 1.0.0\n**Author**: Harvested from your_claude_skills repository (270+ skills managed)\n**Last Updated**: 2025-11-18\n**License**: MIT\n\n## Quick Reference\n\n```bash\n# Download skills from GitHub repos\n.\u002Fbulk-download-skills.sh repos.txt\n\n# Auto-categorize skills\n.\u002Fcategorize-skills.sh skills\u002F\n\n# Find duplicates\n.\u002Ffind-duplicates.sh skills\u002F\n\n# Run health check\n.\u002Fhealth-check.sh skills\u002F\n\n# Generate documentation\n.\u002Fgenerate-docs.sh skills\u002F\n\n# Weekly maintenance\n.\u002Fweekly-maintenance.sh\n```\n\nScale your skill collection management with confidence! 📚\n",{"name":5,"tags":23,"license":14,"description":7},[24,25,26,27,28],"skills","collection-management","automation","organization","deduplication","main","6b73b29e4866f997b1eb47fe8d9631396265fc24",0,"https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn","2026-09-09 16:06:07",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add davidanthonyn\u002Fagent-skills --skill skills-collection-manager",{"tool":41,"command":42},"bunx","bunx skills add davidanthonyn\u002Fagent-skills --skill skills-collection-manager",{"tool":44,"command":45},"pnpm","pnpm dlx skills add davidanthonyn\u002Fagent-skills --skill skills-collection-manager","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills-collection-manager\u002FSKILL.md",true,[],[50,57,65,72,79,88],{"skillNo":51,"name":52,"nameZh":6,"description":53,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":54,"categories":55,"keywords":56,"publishedAt":18},"01M7AQNJDXVNVMN08N5BHBGZBF","zustand-state-management","Production-tested setup for Zustand state management in React applications with TypeScript.\nThis skill provides comprehensive patterns for building scalable, type-safe global state.\n\nUse when: setting up global state in React, migrating from Redux or Context API, implementing\nstate persistence with localStorage, configuring TypeScript with Zustand, using slices pattern\nfor modular stores, adding devtools middleware for debugging, handling Next.js SSR hydration,\nor encountering hydration errors, TypeScript inference issues, or persist middleware problems.\n\nPrevents 5 documented issues: Next.js hydration mismatches, TypeScript double parentheses\nsyntax errors, persist middleware export errors, infinite render loops, and slices pattern\ntype inference failures.\n\nKeywords: zustand, state management, React state, TypeScript state, persist middleware,\ndevtools, slices pattern, global state, React hooks, create store, useBoundStore,\nStateCreator, hydration error, text content mismatch, infinite render, localStorage,\nsessionStorage, immer middleware, shallow equality, selector pattern, zustand v5","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fzustand-state-management\u002FSKILL.md",[],[],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":61,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":18},"01M7AQN2DW9DTPM8BYNZSHQANC","zetic-mlange","Help users integrate the ZETIC Melange (MLange) on-device AI SDK into Android (Kotlin\u002FJava) and iOS (Swift) mobile apps. Use this skill whenever the user mentions Zetic, MLange, Melange, ZeticMLangeModel, ZeticMLangeLLMModel, ZeticMLangeHFModel, on-device NPU inference for mobile, or deploying ML models to Android\u002FiOS with NPU acceleration. Also trigger when users ask about running LLMs on-device with GGUF quantization, mobile NPU model deployment, or converting PyTorch\u002FONNX models for mobile inference. Covers general model inference, LLM inference (streaming token generation), and HuggingFace model loading.","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fzetic-mlange\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fzetic-mlange\u002FSKILL.md",[],[],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":18},"01M7AQMEK370FBPC75N2W8WA4W","youtube-downloader","Download videos, audio, playlists, and channels from YouTube and 1000+ websites using yt-dlp. Supports quality selection, format conversion, subtitle download, playlist filtering, metadata extraction, thumbnail download, and batch operations. Use when downloading YouTube videos in any quality (4K, 8K, HDR), extracting audio as MP3\u002FM4A\u002FFLAC, downloading entire playlists\u002Fchannels, getting subtitles in multiple languages, converting to specific formats, downloading live streams, archiving content, or batch processing multiple URLs. Optimized for reliability with automatic retries, rate limiting, and error handling.","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fyoutube-downloader\u002FSKILL.md",[],[],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":18},"01M7AQHKQ4VQB04NH6BG4SV9Q7","wordpress-plugin-core","This skill provides comprehensive knowledge for WordPress plugin development, covering core patterns, security best practices, database interactions, hooks\u002Ffilters, Settings API, custom post types, REST API, and AJAX. This skill should be used when creating WordPress plugins, troubleshooting security issues, implementing custom post types\u002Ftaxonomies, building admin interfaces, or working with the WordPress database.\n\nUse when: Creating new WordPress plugins, implementing nonces\u002Fsanitization\u002Fescaping, working with $wpdb and prepared statements, building Settings API pages, registering custom post types or taxonomies, implementing REST API endpoints, handling AJAX requests, debugging plugin activation\u002Fdeactivation issues, preventing SQL injection\u002FXSS\u002FCSRF vulnerabilities.\n\nKeywords: wordpress plugin development, wordpress security, wordpress hooks, wordpress filters, wordpress database, wpdb prepare, sanitize_text_field, esc_html, wp_nonce, custom post type, register_post_type, settings api, rest api, admin-ajax, wordpress sql injection, wordpress xss, wordpress csrf, plugin header, activation hook, deactivation hook, wordpress coding standards, wordpress plugin architecture","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fwordpress-plugin-core\u002FSKILL.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":83,"licenseFileUrl":84,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":18},"01M7AQH4JW8F2MJFS1C43TZ2TY","webapp-testing","Test local web applications with Playwright. Use when asked to verify frontend functionality, debug UI behavior, capture browser screenshots, or inspect browser logs.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fwebapp-testing\u002FSKILL.md",[],[],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":18},"01M7AQH0PWD6Z1NN66V15DT25M","web-performance-audit","Audit web performance using Chrome DevTools MCP. Use when asked to audit, profile, debug, or optimize page load performance, Lighthouse scores, or site speed.","https:\u002F\u002Fgithub.com\u002Fdavidanthonyn\u002Fagent-skills\u002Fblob\u002Fmain\u002Fweb-performance-audit\u002FSKILL.md",[],[]]