AgentSkillsCN

pull

从 GitHub 拉取最新配置

SKILL.md
--- frontmatter
name: pull
description: Pull latest configuration from GitHub

Pull Configuration

Pull the latest configuration from your GitHub repository and automatically merge settings.

Usage

code
/claude-github-sync:pull

Configuration Reference

ItemPathDescription
Config file~/.claude/sync-config.jsonSync configuration (repo URL, setup method)
Git remote~/.claude/.git/configPrimary check - git origin remote URL
Sync settings~/.claude/settings.sync.jsonShared settings (synced to GitHub)
Local settings~/.claude/settings.local.jsonMachine-specific settings (gitignored)
Merged output~/.claude/settings.jsonAuto-merged result of sync + local
Merge script~/.claude/scripts/merge-settings.mjsDeep merges sync + local → settings.json

Instructions

Step 1: Check git remote (primary check)

The sync is configured if ~/.claude has a git remote. Config file (~/.claude/sync-config.json) is optional fallback.

bash
cd ~/.claude

# Primary check: git remote
REPO_URL=$(git remote get-url origin 2>/dev/null)
if [ -n "$REPO_URL" ]; then
    echo "✅ Remote: $REPO_URL"
else
    # Fallback: check config file
    CONFIG_FILE="$HOME/.claude/sync-config.json"
    if [ -f "$CONFIG_FILE" ]; then
        echo "⚠️  Config exists but no git remote"
        echo "Run: /claude-github-sync:setup to fix"
        exit 1
    else
        echo "❌ Not configured"
        echo ""
        echo "Run: /claude-github-sync:setup"
        exit 1
    fi
fi

Step 2: Pull changes

bash
cd ~/.claude

# Get current branch
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main")

# Save current HEAD for change detection
HEAD_BEFORE=$(git rev-parse HEAD 2>/dev/null)

# Stash local changes if any
STASHED=false
if ! git diff --quiet 2>/dev/null; then
    echo "Stashing local changes..."
    git stash
    STASHED=true
fi

# Pull with rebase
if git pull --rebase origin "$BRANCH" 2>&1; then
    echo "✅ Pulled latest configuration"
else
    echo "❌ Pull failed"
    echo ""
    echo "Possible issues:"
    echo "  - Network connection"
    echo "  - Merge conflicts (run: git status)"
    echo "  - Remote branch doesn't exist"
    git status --short
fi

# Restore stashed changes
if [ "$STASHED" = true ]; then
    echo "Restoring local changes..."
    git stash pop
fi

# Show what changed
HEAD_AFTER=$(git rev-parse HEAD 2>/dev/null)
if [ "$HEAD_BEFORE" != "$HEAD_AFTER" ]; then
    echo ""
    echo "📋 Changes pulled:"
    echo ""
    echo "--- New commits ---"
    git log --oneline "$HEAD_BEFORE..$HEAD_AFTER"
    echo ""
    echo "--- Files changed ---"
    git diff --stat "$HEAD_BEFORE..$HEAD_AFTER"
else
    echo ""
    echo "📋 No new changes from remote."
fi

Step 3: Merge settings

After pulling, automatically merge sync and local settings.

The merge script can be in multiple locations:

  1. ~/.claude/scripts/merge-settings.mjs (user installed)
  2. Plugin's scripts directory (bundled)
bash
cd ~/.claude

# Find merge script in multiple locations
MERGE_SCRIPT=""

# Location 1: User's scripts directory
if [ -f "$HOME/.claude/scripts/merge-settings.mjs" ]; then
    MERGE_SCRIPT="$HOME/.claude/scripts/merge-settings.mjs"
fi

# Location 2: Plugin cache (find latest version)
if [ -z "$MERGE_SCRIPT" ]; then
    PLUGIN_SCRIPT=$(find "$HOME/.claude/plugins/cache/claude-sync/claude-github-sync" -name "merge-settings.mjs" 2>/dev/null | head -1)
    if [ -n "$PLUGIN_SCRIPT" ]; then
        MERGE_SCRIPT="$PLUGIN_SCRIPT"
    fi
fi

# Location 3: Marketplace source
if [ -z "$MERGE_SCRIPT" ]; then
    MARKETPLACE_SCRIPT="$HOME/.claude/plugins/marketplaces/claude-sync/scripts/merge-settings.mjs"
    if [ -f "$MARKETPLACE_SCRIPT" ]; then
        MERGE_SCRIPT="$MARKETPLACE_SCRIPT"
    fi
fi

# Run merge if found
if [ -n "$MERGE_SCRIPT" ]; then
    echo ""
    echo "Merging settings..."
    node "$MERGE_SCRIPT"
else
    echo ""
    echo "⚠️  merge-settings.mjs not found"
    echo "   Settings will not be auto-merged"
fi

Step 4: Report result

Show the user what was updated.

bash
echo ""
echo "📊 Current settings files:"
ls -la ~/.claude/settings*.json 2>/dev/null | awk '{print "  " $9 " (" $5 " bytes)"}'