Skip to content
Back to skills

Sync Skills

ASecurity

Copy this repo's skills into another agent harness's skills directory by name — resolves the harness alias to its path via scripts/sync-targets.json and runs sync-skills.sh. Use only when the user asks to copy/sync/push the skills to another harness (oh-my-pi, opencode, kimi, codex, etc.) — never trigger automatically.

  • 43 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 19, 2026
ai-agentsgoshellbashgit

Security analysis

A100/100

Scanned September 19, 2026

npx -y skills add foyzulkarim/skills --skill sync-skills --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Sync Skills?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Sync Skills
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/foyzulkarim-sync-skills/badge)](https://www.skillsdirectory.com/skills/foyzulkarim-sync-skills)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: sync-skills
description: "Copy this repo's skills into another agent harness's skills directory by name — resolves the harness alias to its path via scripts/sync-targets.json and runs sync-skills.sh. Use only when the user asks to copy/sync/push the skills to another harness (oh-my-pi, opencode, kimi, codex, etc.) — never trigger automatically."
model: inherit
color: orange
---

# Sync-Skills

Thin natural-language wrapper over `scripts/sync-skills.sh`. The user names a
harness ("copy the skills to oh-my-pi"); you resolve it to a skills directory
and run the sync. All copying, marker safety, and dir resolution live in the
script — you only parse intent, invoke, and relay.

## Prerequisites

Requires `jq` on PATH. `--to <alias>` and `list-targets` resolve `scripts/sync-targets.json` through `jq`; the script fails fast with a clear error if `jq` is missing. Confirm `jq` is installed before invoking — `command -v jq` should print a path.

## Resolve the repo + script (every run)

The script derives its source dir from its own location. Resolve the repo root once:

```bash
ROOT="$(git -C "$PWD" rev-parse --show-toplevel)"
```

Then use `"$ROOT/scripts/sync-skills.sh"`. If `$ROOT/scripts/sync-skills.sh`
does not exist, stop and tell the user to run this from the skills repo checkout.

## Steps

1. **Parse the request** into:
   - a **harness alias** — normalize the user's phrasing to a canonical key
     using this table (additions to `scripts/sync-targets.json` are how the
     table grows over time):

     | User phrasing | Canonical alias |
     |---------------|-----------------|
     | `claude`, `~/.claude`, `claude-code` | `claude` |
     | `omp`, `oh-my-pi`, `"oh my pi"` | `oh-my-pi` |
     | `oc`, `opencode` | `opencode` |
     | `kimi` | `kimi` (unmapped — discovery fallback) |
     | `codex` | `codex` (unmapped — discovery fallback) |

     Quote any alias that contains a space or shell metacharacter when passing
     it to `--to`. To see the full current list:
     ```bash
     bash "$ROOT/scripts/sync-skills.sh" list-targets
     ```
   - **skill names**, if any were named (otherwise all skills are pushed).
   - the **verb**: default `push` ("copy to X"). Only use `pull` / `import` /
     `nuke` if the user explicitly asked for that direction.

2. **Run** (push, the common case):
   ```bash
   bash "$ROOT/scripts/sync-skills.sh" --to "<alias>" push [skill...]
   ```
   Echo the resolved destination (from `list-targets`) before/with the run, then
   relay the script's summary verbatim.

3. **Unknown alias → discovery fallback.** If `--to` exits non-zero with
   "unknown harness", do NOT retry blindly. Instead:
   - Probe a few conventional locations and show what exists:
     ```bash
     ls -d ~/."<name>"/skills ~/.config/"<name>"/skills ~/."<name>" 2>/dev/null
     ```
   - Ask the user to confirm which is the harness's skills bucket (or supply the
     path).
   - Run once against the confirmed path with the literal escape hatch:
     ```bash
     bash "$ROOT/scripts/sync-skills.sh" --target <confirmed-dir> push [skill...]
     ```
   - **Offer** to remember it: append `"<alias>": "<dir>"` to
     `$ROOT/scripts/sync-targets.json` (use `~` for a `$HOME`-relative path) so
     next time `--to <alias>` just works. Only edit the file after the user
     agrees.

## Confirm before running when

- The target is **brand-new / unmapped** (first push to a harness) — show the
  resolved path and get a yes.
- The verb is **`nuke`** or any **`--force`** — these delete/overwrite at the
  target. State exactly what will be removed/overwritten and where, then wait.

A normal `push` to an already-mapped harness needs no confirmation — just echo
the destination and go.

## You Must NOT

- Copy files yourself (`cp`, `rsync`, manual `mkdir`) — the script owns all
  mutation and its marker logic protects unmanaged dirs at the target.
- Call the script via `{base_directory}` — that points at this skill's dir, not
  the repo's `scripts/`. Always resolve `$ROOT` via git.
- Push to a path you guessed without the user confirming it (fallback path).
- Edit `sync-targets.json` before the user agrees to persist a new mapping.
- Run `nuke`/`--force` without an explicit go-ahead.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.