Link skills into ~/.agents/skills as well as ~/.claude/skills

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matt Pocock 2026-06-24 11:27:21 +01:00
commit 74f0450b9c

View file

@ -1,16 +1,30 @@
#!/usr/bin/env bash
set -euo pipefail
# Links all skills in the repository to ~/.claude/skills, so that
# they can be used by the local Claude CLI.
# Links all skills in the repository into the local skill directories used by
# each agent harness:
# - ~/.claude/skills — Claude Code
# - ~/.agents/skills — pi and other Agent-Skills-standard harnesses
# Each entry is a symlink into this repo, so a `git pull` is all that's needed
# to keep installed skills up to date.
REPO="$(cd "$(dirname "$0")/.." && pwd)"
DEST="$HOME/.claude/skills"
DESTS=("$HOME/.claude/skills" "$HOME/.agents/skills")
# If ~/.claude/skills is a symlink that resolves into this repo, we'd end up
# writing the per-skill symlinks back into the repo's own skills/ tree. Detect
# and bail out instead of polluting the working copy.
if [ -L "$DEST" ]; then
# Collect the repo's skills once, link into every destination.
names=()
srcs=()
while IFS= read -r -d '' skill_md; do
src="$(dirname "$skill_md")"
names+=("$(basename "$src")")
srcs+=("$src")
done < <(find "$REPO/skills" -name SKILL.md -not -path '*/node_modules/*' -not -path '*/deprecated/*' -print0)
for DEST in "${DESTS[@]}"; do
# If $DEST is a symlink that resolves into this repo, we'd end up writing the
# per-skill symlinks back into the repo's own skills/ tree. Detect and bail
# out instead of polluting the working copy.
if [ -L "$DEST" ]; then
resolved="$(readlink -f "$DEST")"
case "$resolved" in
"$REPO"|"$REPO"/*)
@ -19,14 +33,13 @@ if [ -L "$DEST" ]; then
exit 1
;;
esac
fi
fi
mkdir -p "$DEST"
mkdir -p "$DEST"
find "$REPO/skills" -name SKILL.md -not -path '*/node_modules/*' -not -path '*/deprecated/*' -print0 |
while IFS= read -r -d '' skill_md; do
src="$(dirname "$skill_md")"
name="$(basename "$src")"
for i in "${!names[@]}"; do
name="${names[$i]}"
src="${srcs[$i]}"
target="$DEST/$name"
if [ -e "$target" ] && [ ! -L "$target" ]; then
@ -34,5 +47,6 @@ while IFS= read -r -d '' skill_md; do
fi
ln -sfn "$src" "$target"
echo "linked $name -> $src"
echo "linked $name -> $src ($DEST)"
done
done