Skill Sync
Cross-platform skill synchronization tool that manages skills in a central repository and syncs to multiple AI platforms via symbolic links. It automatically scans your system to detect which platforms you use.
Architecture
~/.skill_repo/ ← Central Repository (source of truth)
├── my-skill/
├── another-skill/
└── .skill_sync_metadata.json
~/.claude/skills/ ← Symlink → ~/.skill_repo/
~/.github/skills/ ← Symlink → ~/.skill_repo/ (Copilot)
~/.cursor/skills/ ← Symlink → ~/.skill_repo/
~/.gemini/antigravity/skills/ ← Symlink → ~/.skill_repo/ (Antigravity)
...and others
Supported Platforms
The tool automatically detects if any of the following platforms are installed:
- Claude Code (
~/.claude/skills) - GitHub Copilot (
~/.copilot/skills) - Google Antigravity (
~/.gemini/antigravity/skills) - Cursor (
~/.cursor/skills) - OpenCode (
~/.config/opencode/skill) - OpenAI Codex (
~/.codex/skills) - Gemini CLI (
~/.gemini/skills) - Windsurf (
~/.codeium/windsurf/skills) - Qwen Code (
~/.qwen/skills) - Qoder (
~/.qoder/skills)
Core Scripts
1. Install Skill (install_skill.py)
Install a skill to central repo and sync to selected platforms.
Usage:
python3 scripts/install_skill.py <path-or-url> [--local]
Supported inputs:
- Local skill directory:
./my-skill/ - Packaged .skill file:
./my-skill.skill - Git Repository URL:
https://github.com/user/my-skill.git
Flags:
--local: Install skill to the current project's local configuration (e.g.,./.claude/skills) instead of the global system directory.
Workflow:
- Extract skill name from path, filename, or Git URL
- Scan system (or local project) for available AI platforms
- Check for conflicts in repo and discovered platforms
- Ask user confirmation if conflicts exist
- Install to
~/.skill_repo/(central). Note: Git URLs are cloned here. - Ask user which detected platforms to enable (interactive selection)
- Create symlinks to selected platforms
- Update sync metadata
Platform Selection Menu (Dynamic):
🔗 Detected platforms. Select which to enable this skill:
1. Claude Code (~/.claude/skills)
2. Gemini CLI (~/.gemini/skills)
3. All detected (default)
Enter choice (e.g. '1' or '3'):
Install from cloned GitHub repo
git clone https://github.com/user/awesome-skill.git python3 ~/.claude/skills/skill-sync/scripts/install_skill.py ./awesome-skill/
### 2. Update Skills (`update_skills.py`)
Update all Git-based skills in the central repository by running `git pull`.
**Usage**:
```bash
python3 scripts/update_skills.py [skill-name ...] [--all]
Features:
- Parallel Check: Rapidly checks git status for all skills concurrently.
- Detailed Status: Shows if updates are available and how many commits behind.
- Selective Update: Interactive menu to choose which skills to update (if no args provided).
- Specific Update:
python3 scripts/update_skills.py my-skill - Update All:
python3 scripts/update_skills.py --all
3. List All Skills (list_synced.py)
Display all skills in central repo and their sync status across all detected platforms.
Usage:
python3 scripts/list_synced.py
Status Icons:
| Icon | Meaning |
|---|---|
| ✅ | Synced (symlink points to central repo) |
| 🔗 | Linked (symlink points elsewhere) |
| 📁 | Local directory (not synced) |
| ❌ | Not installed |
| ⚠️ | Broken symlink |
Example output:
📚 All Skills (3 total)
================================================================================
📦 pdf-editor
Repo: ✅ ~/.skill_repo/pdf-editor
Gemini ✅ Synced → ~/.skill_repo/pdf-editor
Claude ✅ Synced → ~/.skill_repo/pdf-editor
Antigravity ❌ Not installed
📦 other-skill
Repo: ❌ Not in central repo
Gemini 📁 Local directory (not synced)
Claude ❌ Not installed
Antigravity ❌ Not installed
================================================================================
📊 Summary:
Total skills: 3
In central repo: 2
Synced to 1+ platforms: 2
4. Uninstall Skill (uninstall_skill.py)
Remove a skill from selected locations with interactive selection.
Usage:
python3 scripts/uninstall_skill.py <skill-name>
Workflow:
- Detect all locations where skill exists
- Display locations with type info (directory vs symlink)
- Ask user which locations to remove (supports multi-select)
- Confirm before deletion
- Update sync metadata
Uninstall Selection Menu:
📦 Found skill 'my-skill' in 3 location(s):
- repo: ~/.skill_repo/my-skill [directory]
- gemini: ~/.gemini/skills/my-skill [symlink → ~/.skill_repo/my-skill]
- claude: ~/.claude/skills/my-skill [symlink → ~/.skill_repo/my-skill]
🗑️ Select locations to remove:
1. Central Repo (~/.skill_repo) [directory]
2. Gemini (~/.gemini/skills) [symlink]
3. Claude Code (~/.claude/skills) [symlink]
4. All locations
Enter choice (e.g. '1,2' or '4' for all):
Example:
python3 ~/.claude/skills/skill-sync/scripts/uninstall_skill.py pdf-editor
Metadata Tracking
Sync status stored in: ~/.skill_repo/.skill_sync_metadata.json
Integration with AI Workflows
When AI generates a new skill
# AI creates skill at ./new-skill/
python3 ~/.claude/skills/skill-sync/scripts/install_skill.py ./new-skill/
When cloning from GitHub
git clone https://github.com/user/awesome-skill.git
python3 ~/.claude/skills/skill-sync/scripts/install_skill.py ./awesome-skill/
When installing from .skill file
python3 ~/.claude/skills/skill-sync/scripts/install_skill.py ~/Downloads/my-skill.skill
Troubleshooting
Check sync status:
python3 ~/.claude/skills/skill-sync/scripts/list_synced.py
Reinstall/resync a skill:
# Re-run install from central repo to update symlinks
python3 ~/.claude/skills/skill-sync/scripts/install_skill.py ~/.skill_repo/my-skill
Permissions:
# Ensure scripts are executable
chmod +x ~/.claude/skills/skill-sync/scripts/*.py
Missing directories: The scripts automatically create platform directories if they don't exist.