skill-deployer
Install and deploy Claude Code skills from URLs with minimal interaction. Use this skill whenever a user provides a URL to a skill and wants to install it, deploy it, import it, or add it. Trigger on phrases like "install this skill", "import skill from", "deploy skill", "add this skill", or any message containing a GitHub URL pointing to a skill directory or a .skill file URL. Also trigger when users say "get this skill" or paste a URL and say something like "use this" or "set this up".
Skill Deployer
Install Claude Code skills from URLs in one step. The user gives you a URL, you handle the rest.
Supported URL formats
- GitHub tree URL — e.g.
https://github.com/org/repo/tree/main/skills/my-skill - GitHub blob URL — e.g.
https://github.com/org/repo/blob/main/skills/my-skill/SKILL.md - Raw
.skillfile URL — a direct link to a.skillzip file - Local
.skillfile path — a path on disk to a.skillzip
Critical: One confirmation only
Every Bash tool call requires a user confirmation. The entire deployment — discovery, download, directory creation, and validation — must happen in a single Bash command so the user only confirms once. This is the core UX requirement of this skill.
How to deploy
Step 1: Parse the URL (no tool call needed)
Determine the URL type and extract owner, repo, branch, and path from the URL mentally — no Bash call required.
- Tree:
https://github.com/{owner}/{repo}/tree/{branch}/{path} - Blob:
https://github.com/{owner}/{repo}/blob/{branch}/{path}— walk up to the directory containing SKILL.md .skillfile — a zip archive to download and extract
Step 2: Deploy in a single Bash command
Combine discovery, directory creation, downloading, and validation into one chained shell command. Wrap everything in bash -c '...' to avoid zsh compatibility issues.
For GitHub URLs, use the recursive tree API to discover all files in one API call, then download each:
bash -c 'OWNER="owner" REPO="repo" BRANCH="main" SPATH="skills/my-skill" DEST="$HOME/.claude/skills/my-skill" && mkdir -p "$DEST" && gh api "repos/$OWNER/$REPO/git/trees/$BRANCH?recursive=1" --jq ".tree[] | select(.path | startswith(\"$SPATH/\")) | select(.type==\"blob\") | .path" | while read -r fpath; do rel="${fpath#$SPATH/}"; dir="$(dirname "$rel")"; [ "$dir" != "." ] && mkdir -p "$DEST/$dir"; gh api "repos/$OWNER/$REPO/contents/$fpath" --jq ".content" | base64 -d > "$DEST/$rel" && echo " $rel"; done && if [ -f "$DEST/SKILL.md" ] && head -1 "$DEST/SKILL.md" | grep -q "^---"; then echo "Installed: my-skill → $DEST ($(find "$DEST" -type f | wc -l | tr -d " ") files)"; else echo "Warning: SKILL.md missing or invalid frontmatter"; fi'
Key details about this pattern:
bash -c '...'ensures bash compatibility regardless of the user's shell- The recursive tree API (
git/trees/BRANCH?recursive=1) discovers ALL files in a single API call — no need to recurse into subdirectories manually - Filter with
select(.path | startswith(...))to get only files under the skill's path dirname+mkdir -pcreates subdirectories as needed- Validation checks SKILL.md exists and has frontmatter
For .skill zip files:
bash -c 'curl -L -o /tmp/skill.zip "{url}" && unzip -o /tmp/skill.zip -d ~/.claude/skills/ && echo "Installed"'
Install location
Install to: ~/.claude/skills/{skill-name}/
The skill name comes from the directory name in the source repo (for GitHub URLs) or the top-level directory inside the zip (for .skill files).
If the skill already exists at that location, tell the user and ask whether to overwrite before proceeding — this is the only question you should ever ask.
Validate and report
After the single command completes, report:
- The skill name and where it was installed
- A one-line summary of what the skill does (from the description)
- That it's ready to use immediately
Keep the output concise. The whole point of this skill is speed and minimal friction.
Edge cases
- URL points to a single SKILL.md file: Walk up one directory level to get the full skill folder, or if that's not possible, create a skill directory with just the SKILL.md.
- URL is a GitHub repo root with no skill subdirectory: Look for SKILL.md at the repo root. If found, use the repo name as the skill name.
- Branch isn't
main: The URL parser handles any branch name in the tree/blob URL format. ghCLI not available: Fall back tocurlwith the GitHub raw content API (raw.githubusercontent.com). This won't need authentication for public repos.- Private repos: The
ghCLI handles auth automatically if the user is logged in. If it fails, suggestgh auth login.
What NOT to do
- Don't modify the skill contents during installation — install exactly what's in the source
- Don't create extra files (READMEs, configs) that weren't in the source
- Don't prompt the user for anything beyond the overwrite confirmation (if needed)
- Don't run any scripts from the skill during installation