# Sync Skills

> Sync skills between this repo and the global skill directories for Claude Code (~/.claude/skills/) and Cursor (~/.cursor/skills-cursor/) using symlinks (default) or copies. Use when the user wants to link, sync, publish, push, or copy skills globally, check sync status, unlink, or pull a skill from a global location back into the repo. Trigger on "sync skills", "link skills", "publish skills", "skill status", "/sync-skills", "are my skills linked", "unlink skills".

- Skill: `ivy00johns/sync-skills` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add ivy00johns/sync-skills`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ivy00johns/sync-skills/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ivy00johns (https://skillmd.com/u/ivy00johns)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/ivy00johns/sync-skills

---


# Sync Skills Between Repo and Global Locations

Link or copy skills between this repo and the global skill directories that Claude Code and Cursor read from. Symlinks are the default — edits in the repo are instantly available everywhere without copying.

## Skill Locations

| Location | Path | Used by |
| -------- | ---- | ------- |
| Repo (source of truth) | `skills/` | This workspace |
| Claude Code (global) | `~/.claude/skills/` | All Claude Code projects |
| Cursor (global) | `~/.cursor/skills-cursor/` | All Cursor workspaces |

The repo organizes skills into category directories (`contracts/`, `meta/`, `roles/`, `workflows/`, `orchestrator/`, `git/`). For Claude Code, symlinks are **flattened** — each individual skill is linked directly under `~/.claude/skills/` (no category subdirs) because Claude Code only discovers skills at `~/.claude/skills/<skill-name>/SKILL.md`. For Cursor, symlinks are created at the category level.

### Excluded directories

Two top-level directories under `skills/` are excluded from discovery and never get symlinked:

- `skills/archive/` — retired skills kept as reference-only audit trail
- `skills/in-progress/` — drafts under active development

The exclusion list lives in `SKIP_CATEGORIES` near the top of `scripts/sync-skills.sh`. Add a new entry there if another staging directory ever gets introduced. The corresponding paths must also be kept out of `.claude-plugin/plugin.json`'s `skills` array — otherwise the plugin would load them even though `sync-skills` doesn't.

## Quick Reference

```bash
SCRIPT="skills/workflows/sync-skills/scripts/sync-skills.sh"

# Link all repo skill categories to both Claude Code and Cursor
$SCRIPT --link --to-all

# Check what's linked, copied, or missing
$SCRIPT --status

# Remove broken symlinks (e.g. after deleting a skill from the repo)
$SCRIPT --clean

# Link just one category to Claude Code
$SCRIPT --link --to-claude meta

# Copy instead of link (for machines without repo access)
$SCRIPT --copy --to-all

# Remove symlinks (restore independence)
$SCRIPT --unlink --to-all

# Pull a skill from Cursor into the repo
$SCRIPT --from-cursor shell

# Preview what would happen
$SCRIPT --dry-run --link --to-all
```

## Modes

### Link Mode (default for `--to-*`)

Creates symlinks from global locations pointing to repo directories. This is the development workflow — edit skills in the repo and they're instantly live in Claude Code and Cursor.

- **Claude Code**: Skills are **flattened** — each individual skill gets its own symlink directly under `~/.claude/skills/` (e.g., `~/.claude/skills/skill-review` → `repo/skills/meta/skill-review`). This is required because Claude Code only discovers skills at `~/.claude/skills/<skill-name>/SKILL.md`.
- **Cursor**: Symlinks are created at the **category level** (e.g., `~/.cursor/skills-cursor/meta` → `repo/skills/meta`)
- Non-repo skills in global locations (e.g., `~/.claude/skills/builtWithAgent/`) are untouched
- If a copy already exists where a symlink would go, the script reports it and replaces the copy with a symlink (use `--dry-run` to preview first)

### Copy Mode (`--copy`)

Copies skill directories instead of symlinking. Use this when:

- Deploying skills to a machine that doesn't have the repo cloned
- You need a frozen snapshot that won't change with repo edits
- The target location is on a different filesystem that doesn't support symlinks

### Pull Mode (`--from-cursor`, `--from-claude`)

Copies skills FROM global locations INTO the repo. Always copies (not symlinks) since the repo is the destination. Useful for importing skills created outside this repo.

## Script Flags

| Flag | Purpose |
| ---- | ------- |
| `--link` | Create symlinks (default for `--to-*` operations) |
| `--copy` | Copy files instead of symlinking |
| `--unlink` | Remove symlinks to repo (restores global locations to independent state) |
| `--to-cursor` | Target `~/.cursor/skills-cursor/` |
| `--to-claude` | Target `~/.claude/skills/` |
| `--to-all` | Target both Claude Code and Cursor |
| `--from-cursor` | Pull from Cursor into repo |
| `--from-claude` | Pull from Claude Code into repo |
| `--from-all` | Pull from both |
| `--status` | Show what's linked, copied, or missing across all locations |
| `--clean` | Remove broken symlinks from global locations |
| `--dry-run` | Preview what would happen without making changes |
| `-h, --help` | Show help |

Append category or skill names after flags to target specific ones:

```bash
$SCRIPT --link --to-claude meta roles    # Link only meta/ and roles/
$SCRIPT --from-cursor shell              # Pull only the shell skill
```

## How It Works

**Linking:** For Claude Code, discovers every individual skill within category directories and creates a flattened symlink for each (e.g., `~/.claude/skills/skill-review` → `repo/skills/meta/skill-review`). For Cursor, creates category-level symlinks. If the target already exists as a real directory, warns before replacing.

**Status detection:** Checks each expected location and reports whether it's a symlink (and where it points), a copy, or missing. Also detects broken symlinks.

**Non-repo skills are safe:** The script only manages categories that exist in this repo. Skills like `~/.claude/skills/builtWithAgent/` or Cursor's native skills are never touched.

## After Linking

Once linked, skills are available automatically:

- **Claude Code**: Skills in `~/.claude/skills/` are picked up by new sessions
- **Cursor**: Skills in `~/.cursor/skills-cursor/` appear in all workspaces

Edit any skill in the repo and the change is live immediately — no sync step needed.

To verify: `$SCRIPT --status`

