move claude-marketplace to ai-proj-helper
This commit is contained in:
124
sync-skills.sh
Executable file
124
sync-skills.sh
Executable file
@@ -0,0 +1,124 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Sync local skills to marketplace plugins
|
||||
# Usage: ./sync-skills.sh [marketplace-dir]
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
LOCAL_SKILLS_DIR="$HOME/.claude/skills"
|
||||
MARKETPLACE_DIR="${1:-$(dirname "$0")}"
|
||||
PLUGINS_DIR="$MARKETPLACE_DIR/plugins"
|
||||
|
||||
echo "🔄 Syncing skills to marketplace..."
|
||||
echo "Source: $LOCAL_SKILLS_DIR"
|
||||
echo "Target: $PLUGINS_DIR"
|
||||
echo ""
|
||||
|
||||
# Check if local skills directory exists
|
||||
if [ ! -d "$LOCAL_SKILLS_DIR" ]; then
|
||||
echo "❌ Error: Local skills directory not found: $LOCAL_SKILLS_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Track changes
|
||||
new_count=0
|
||||
updated_count=0
|
||||
unchanged_count=0
|
||||
|
||||
# Loop through each local skill
|
||||
for skill_dir in "$LOCAL_SKILLS_DIR"/*; do
|
||||
# Skip non-directories and special files
|
||||
if [ ! -d "$skill_dir" ] || [ "$(basename "$skill_dir")" = ".git" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Skip registry.yaml if it exists as a directory
|
||||
if [ "$(basename "$skill_dir")" = "registry.yaml" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
skill_name=$(basename "$skill_dir")
|
||||
plugin_name="${skill_name}-plugin"
|
||||
plugin_dir="$PLUGINS_DIR/$plugin_name"
|
||||
|
||||
# Check if SKILL.md exists
|
||||
if [ ! -f "$skill_dir/SKILL.md" ]; then
|
||||
echo "⚠️ Skipping $skill_name (no SKILL.md)"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Check if plugin already exists
|
||||
if [ -d "$plugin_dir" ]; then
|
||||
# Compare SKILL.md files
|
||||
if diff -q "$skill_dir/SKILL.md" "$plugin_dir/skills/SKILL.md" > /dev/null 2>&1; then
|
||||
echo "✓ $skill_name (unchanged)"
|
||||
((unchanged_count++))
|
||||
else
|
||||
echo "📝 $skill_name (updated)"
|
||||
cp "$skill_dir/SKILL.md" "$plugin_dir/skills/"
|
||||
((updated_count++))
|
||||
fi
|
||||
else
|
||||
echo "➕ $skill_name (new)"
|
||||
|
||||
# Create plugin directory structure
|
||||
mkdir -p "$plugin_dir/.claude-plugin"
|
||||
mkdir -p "$plugin_dir/skills"
|
||||
|
||||
# Copy SKILL.md
|
||||
cp "$skill_dir/SKILL.md" "$plugin_dir/skills/"
|
||||
|
||||
# Extract description from SKILL.md frontmatter
|
||||
description=$(grep "^description:" "$skill_dir/SKILL.md" | sed 's/^description: *//' | tr -d '\n\r')
|
||||
if [ -z "$description" ]; then
|
||||
description="Plugin for $skill_name"
|
||||
fi
|
||||
|
||||
# Create plugin.json
|
||||
cat > "$plugin_dir/.claude-plugin/plugin.json" << EOF
|
||||
{
|
||||
"name": "$plugin_name",
|
||||
"description": "$description",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "qiudl"
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
((new_count++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "📊 Summary:"
|
||||
echo " New: $new_count"
|
||||
echo " Updated: $updated_count"
|
||||
echo " Unchanged: $unchanged_count"
|
||||
echo ""
|
||||
|
||||
# Regenerate marketplace.json if there are changes
|
||||
if [ $new_count -gt 0 ] || [ $updated_count -gt 0 ]; then
|
||||
echo "🔄 Regenerating marketplace.json..."
|
||||
cd "$MARKETPLACE_DIR"
|
||||
|
||||
# Run the generate script if it exists
|
||||
if [ -f "generate-marketplace.py" ]; then
|
||||
python3 generate-marketplace.py
|
||||
else
|
||||
echo "⚠️ Warning: generate-marketplace.py not found, skipping marketplace.json regeneration"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Sync complete! Changes ready to commit."
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " cd $MARKETPLACE_DIR"
|
||||
echo " git status"
|
||||
echo " git add ."
|
||||
echo " git commit -m 'Sync skills from local'"
|
||||
echo " git push"
|
||||
else
|
||||
echo "✅ All plugins are up to date!"
|
||||
fi
|
||||
Reference in New Issue
Block a user