$npx -y skills add crossoverJie/SkillDeck --skill skilldeckManage AI agent skills via natural language — install, update, delete, and assign skills to agents using SkillDeck's filesystem conventions.
| 1 | # SkillDeck Manager |
| 2 | |
| 3 | Manage AI coding agent skills through natural language. This skill teaches you how to install, update, delete, and assign skills using SkillDeck's filesystem conventions. |
| 4 | |
| 5 | SkillDeck is a macOS GUI app that manages skills across 14 AI agents. Skills are stored as directories containing `SKILL.md` files. This skill lets you perform the same operations from the terminal. |
| 6 | |
| 7 | ## Filesystem Layout |
| 8 | |
| 9 | ``` |
| 10 | ~/.agents/ |
| 11 | ├── skills/ # Canonical storage (real files live here) |
| 12 | │ ├── my-skill/ |
| 13 | │ │ ├── SKILL.md # Skill definition (YAML frontmatter + markdown) |
| 14 | │ │ └── ... # Other files (scripts, templates, etc.) |
| 15 | │ └── another-skill/ |
| 16 | │ └── SKILL.md |
| 17 | ├── .skill-lock.json # Lock file (v3, shared with npx skills) |
| 18 | └── .skilldeck-cache.json # SkillDeck's private cache (do not modify) |
| 19 | |
| 20 | ~/.claude/skills/ # Claude Code skills (symlinks → canonical) |
| 21 | ~/.codex/skills/ # Codex skills (symlinks → canonical, also reads ~/.agents/skills/) |
| 22 | ~/.gemini/skills/ # Gemini CLI skills |
| 23 | ~/.copilot/skills/ # Copilot CLI skills (also reads ~/.claude/skills/) |
| 24 | ~/.config/opencode/skills/ # OpenCode skills (also reads ~/.claude/skills/ and ~/.agents/skills/) |
| 25 | ~/.cursor/skills/ # Cursor skills (also reads ~/.claude/skills/) |
| 26 | ~/.kiro/skills/ # Kiro skills |
| 27 | ~/.codebuddy/skills/ # CodeBuddy skills |
| 28 | ~/.openclaw/skills/ # OpenClaw skills |
| 29 | ~/.trae/skills/ # Trae skills |
| 30 | ~/.qoder/skills/ # Qoder skills |
| 31 | ~/.qclaw/skills/ # QClaw skills |
| 32 | ~/.workbuddy/skills/ # WorkBuddy skills |
| 33 | ~/.gemini/antigravity/skills/ # Antigravity skills |
| 34 | ``` |
| 35 | |
| 36 | **Key rules:** |
| 37 | - The real copy of every skill lives in `~/.agents/skills/<name>/` |
| 38 | - Each agent gets a **symlink** pointing to the canonical directory |
| 39 | - Example: `~/.claude/skills/my-skill` → `~/.agents/skills/my-skill` |
| 40 | - Some agents can read other agents' directories (cross-directory inheritance): |
| 41 | - **Codex** reads `~/.agents/skills/` natively (no symlink needed) |
| 42 | - **Copilot** reads `~/.claude/skills/` |
| 43 | - **OpenCode** reads `~/.claude/skills/` and `~/.agents/skills/` |
| 44 | - **Cursor** reads `~/.claude/skills/` |
| 45 | |
| 46 | ## Default Agent Configuration |
| 47 | |
| 48 | When installing a skill, you need to decide which agents to assign it to. The recommended approach: |
| 49 | |
| 50 | 1. **Auto-detect installed agents** — check which CLI commands exist on the system |
| 51 | 2. **Assign to all detected agents** — unless the user specifies a subset |
| 52 | |
| 53 | The following script detects installed agents and builds a list of their skills directories: |
| 54 | |
| 55 | ```bash |
| 56 | # Agent detection map: CLI command → skills directory |
| 57 | declare -A AGENT_DIRS=( |
| 58 | ["claude"]="$HOME/.claude/skills" |
| 59 | ["codex"]="$HOME/.codex/skills" |
| 60 | ["gemini"]="$HOME/.gemini/skills" |
| 61 | ["opencode"]="$HOME/.config/opencode/skills" |
| 62 | ["antigravity"]="$HOME/.gemini/antigravity/skills" |
| 63 | ["cursor"]="$HOME/.cursor/skills" |
| 64 | ["kiro"]="$HOME/.kiro/skills" |
| 65 | ["codebuddy"]="$HOME/.codebuddy/skills" |
| 66 | ["openclaw"]="$HOME/.openclaw/skills" |
| 67 | ["trae"]="$HOME/.trae/skills" |
| 68 | ["qoder"]="$HOME/.qoder/skills" |
| 69 | ["qclaw"]="$HOME/.qclaw/skills" |
| 70 | ["workbuddy"]="$HOME/.workbuddy/skills" |
| 71 | ) |
| 72 | |
| 73 | # Detect which agents are installed |
| 74 | INSTALLED_DIRS=() |
| 75 | for CMD in "${!AGENT_DIRS[@]}"; do |
| 76 | if which "$CMD" &>/dev/null; then |
| 77 | INSTALLED_DIRS+=("${AGENT_DIRS[$CMD]}") |
| 78 | echo "Detected: $CMD → ${AGENT_DIRS[$CMD]}" |
| 79 | fi |
| 80 | done |
| 81 | |
| 82 | # Copilot CLI is a GitHub CLI extension (gh copilot), not a standalone binary. |
| 83 | # `which gh` only confirms GitHub CLI is installed, not Copilot specifically. |
| 84 | # Check for the copilot extension explicitly. |
| 85 | if which gh &>/dev/null && gh extension list 2>/dev/null | grep -q copilot; then |
| 86 | INSTALLED_DIRS+=("$HOME/.copilot/skills") |
| 87 | echo "Detected: copilot → $HOME/.copilot/skills" |
| 88 | fi |
| 89 | |
| 90 | echo "Found ${#INSTALLED_DIRS[@]} installed agents" |
| 91 | ``` |
| 92 | |
| 93 | Use `INSTALLED_DIRS` as the default target when installing. If the user says "only install for Claude Code", filter to just `$HOME/.claude/skills`. |
| 94 | |
| 95 | ## Lock File Format |
| 96 | |
| 97 | Location: `~/.agents/.skill-lock.json` (version 3) |
| 98 | |
| 99 | ```json |
| 100 | { |
| 101 | "version": 3, |
| 102 | "skills": { |
| 103 | "skill-name": { |
| 104 | "source": "owner/repo", |
| 105 | "sourceType": "github", |
| 106 | "sourceUrl": "https://github.com/owner/repo.git", |
| 107 | "skillPath": "skills/skill-name/SKILL.md", |
| 108 | "skillFolderHash": "abc123...", |
| 109 | "installedAt": "2024-01-01T00:00:00Z", |
| 110 | "updatedAt": "2024-01-01T00:00:00Z" |
| 111 | } |
| 112 | }, |
| 113 | "dismissed": {}, |
| 114 | "lastSelectedAgents": [] |
| 115 | } |
| 116 | ``` |
| 117 | |
| 118 | **Fields:** |
| 119 | - `source`: Repository identifier (e.g., `"crossoverJie/skills"`) or local path |
| 120 | - `sourceType`: `"github"`, `"local"`, or `"clawhub"` |
| 121 | - `sourceUrl`: Full git URL |
| 122 | - `skillPath`: Relative pat |