One source of truth for local AI agent skills.
skill-sync turns a messy multi-agent setup into a maintainable local skill system:
- scan skills across Codex, Claude, OpenClaw, OpenCode, workspace
./skills, and shared agent roots - score the hygiene of your current setup
- show shared, duplicate, compatible, and host-specific skills
- pick a canonical source automatically
- replace duplicate copies with symlinks
- back up every replaced install so you can restore it later
- export a portable layout manifest and recreate that topology on another machine
skill-sync is built for people who:
- use more than one AI coding agent
- install lots of local skills
- keep a shared skill library in
~/.agents/skills - move between machines or rebuild environments often
- want one canonical skill source instead of version drift everywhere
In a real machine, the same skill often appears in multiple places:
~/.codex/skills~/.claude/skills~/.openclaw/skills~/.config/opencode/skills~/.agents/skills<workspace>/skills
That creates drift:
- one copy gets updated, another stays stale
- the same skill gets installed repeatedly
- nobody remembers which copy is the real source of truth
skill-sync gives you four things that basic skill managers usually do not:
-
Cross-host discovery
It scans all the common local roots at once instead of showing one host in isolation. -
Canonical source selection
It decides which copy should win based on strategy, timestamps, shared roots, and your preferred source order. -
Safe convergence
It can turn duplicates into symlinks and centralize ownership without destructive blind replacement. -
Reversible operations
Every dedupe run writes a restorable backup manifest under~/.skill-sync/backups.
Compared with generic local skill managers, skill-sync is specifically about:
- cross-agent skill hygiene
- canonical source adoption
- symlink-based dedupe
- compatible skill diffing
- reversible local convergence
<current-workdir>/skills~/.codex/skills~/.agents/skills~/.claude/skills~/.claude/skills/anthropic-skills/skills~/.config/opencode/skills~/.openclaw/skills~/.openclaw/extensions/*/skills
Install into your main hosts:
git clone https://github.com/LearnPrompt/skill-sync.git
cd skill-sync
./install.sh --codex --claude --openclaw --agentsScan everything:
python3 scripts/skill_sync.pyExport the current topology as a migration manifest:
python3 scripts/skill_sync.py \
--adopt-root agents \
--export-manifest .skill-sync/agent-layout.jsonPreview that layout on another machine:
python3 scripts/skill_sync.py \
--import-manifest .skill-sync/agent-layout.jsonApply it with backups:
python3 scripts/skill_sync.py \
--import-manifest .skill-sync/agent-layout.json \
--applyShow only shared and host-specific skills:
python3 scripts/skill_sync.py --status shared,specific --list-namesInspect a compatibility conflict:
python3 scripts/skill_sync.py --diff rapid-ocrPreview safe dedupe:
python3 scripts/skill_sync.py --dedupe --strategy strictPreview a full convergence onto the shared agent root:
python3 scripts/skill_sync.py --adopt-root agentsApply that convergence:
python3 scripts/skill_sync.py --adopt-root agents --applyRestore the latest run:
python3 scripts/skill_sync.py --restore latest
python3 scripts/skill_sync.py --restore latest --applyDiscovered 99 unique skills from 183 installs.
Hygiene score: 46/100 (risky) | shared_ratio=38.4% | review=2 | duplicates=20
RECOMMENDED ACTIONS
- [high] Review 2 compatible skills before dedupe
- [medium] Deduplicate 20 identical multi-host skills
- [low] Preview a single-root convergence plan
The point is not just to list skills. The point is to tell you what to do next.
Run the fast local checks:
python3 -m py_compile scripts/skill_sync.py
python3 -m unittest discover -s tests -qshared: multiple hosts already point to the same real pathduplicate: portable installs match exactly but live at different real pathscompatible: portable installs share a name but differ in contentspecific: found on only one hostmixed: same name exists with incompatible formats or host-specific layouts
strict: only dedupe identical portable skillsprefer-latest: keep the newest portable copy when content differstrust-high: same canonical logic asprefer-latest, but allows more aggressive replacement of scanned roots
Every scan computes a rough operational score so you can tell whether your local skill ecosystem is clean or drifting.
The report suggests next steps instead of dumping raw data only.
Use --diff <skill> to compare portable installs against the selected canonical source and see which files changed, were added, or removed.
Use --adopt-root agents or another root to preview or apply a convergence plan around one canonical host.
Use --export-manifest to save the desired symlink topology and --import-manifest to recreate that topology elsewhere.
The manifest records:
- which skills are portable enough to converge
- which host should act as canonical source
- which primary hosts should expose each skill
The manifest does not copy skill payloads themselves. On the target machine, the canonical source still needs to exist locally.
If you already use ~/.agents/skills as a shared skill library, that works especially well with skill-sync.
By default:
- it participates in discovery
- it often becomes the canonical source because it is first in the default source order
That is usually desirable. If you want a different preference order:
python3 scripts/skill_sync.py --source-order workspace,codex,claude,agents,opencode,openclawApplied runs are written to:
~/.skill-sync/backups/<run-id>/
Each run stores:
manifest.jsonoriginals/...latest
This makes dedupe reversible. A real directory is moved to backup before a symlink replaces it.
install.sh supports:
--codex--agents--claude--opencode--openclaw--all--copy--force
Examples:
./install.sh --all
./install.sh --codex --claude --force
./install.sh --openclaw --copy.
├── SKILL.md
├── README.md
├── install.sh
├── agents/openai.yaml
├── references/compatibility.md
└── scripts/skill_sync.py
MIT