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

  1. GitHub tree URL — e.g. https://github.com/org/repo/tree/main/skills/my-skill
  2. GitHub blob URL — e.g. https://github.com/org/repo/blob/main/skills/my-skill/SKILL.md
  3. Raw .skill file URL — a direct link to a .skill zip file
  4. Local .skill file path — a path on disk to a .skill zip

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
  • .skill file — 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 -p creates 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.
  • gh CLI not available: Fall back to curl with the GitHub raw content API (raw.githubusercontent.com). This won't need authentication for public repos.
  • Private repos: The gh CLI handles auth automatically if the user is logged in. If it fails, suggest gh 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