publish-skill について
publish-skillは、ローカルで編集したスキルをai-skillsリポジトリに公開し、プロジェクトへ再インストールするワークフロー用スキルです。レビュー、確認、ロールバック用スナップショット、ハッシュ照合で公開手順を管理します。
主な機能
- 01ai-skillsリポジトリの特定
- 02新規・変更スキルの検出
- 03公開前の変更レビュー
- 04公開スキルの導入とロックファイル更新
- 05保存したハッシュとの内容照合
活用シーン
- 01新規作成したスキルの公開
- 02共有スキルの更新
- 03公開済みスキルのプロジェクトへの導入
- 04公開・導入後の内容不一致への対処
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ camacho/ ai-skills --skill publish-skillインストール後、Claude Code で/publish-skillを入力して読み込まれたか確認します。
詳細
実行するタイミング
- ユーザーが「スキルを公開」「スキルを更新」「スキルの変更をプッシュ」「/publish-skill」と言ったとき
.agents/skills/内のスキルをローカルで編集した後
手順
1. 事前確認
ai-skills のパスを次の順に特定します。
$AI_SKILLS_REPO環境変数~/projects/camacho/ai-skills- ユーザーに尋ねる
次に、作業ツリーがクリーンであることを確認します。
git -C "$AI_SKILLS_PATH" status --porcelain
変更がある場合:停止します。最初に ai-skills の変更をコミットするか、スタッシュするようユーザーに伝えてください。
2. 新規および変更済みのスキルを検出する
.agents/skills/ 内の各ディレクトリについて、次を実行します。
skill_name=$(basename "$dir")
local_hash=$(git hash-object ".agents/skills/$skill_name/SKILL.md" 2>/dev/null)
remote_hash=$(git hash-object "$AI_SKILLS_PATH/skills/$skill_name/SKILL.md" 2>/dev/null || echo "")
分類:
remote_hashが空 → 🆕 新規local_hash != remote_hash→ ✏️ 変更済み- 一致 → 変更なし。スキップ
一覧を提示します。続行する前に確認を求めてください。各 local_hash を記録してください — ステップ 7 の安全確認に必要です。
3. スナップショット(ロールバック地点)
承認された各スキルについて、次を実行します。
git add -f ".agents/skills/$skill_name/SKILL.md"
git commit -m "chore(skills): snapshot $skill_name before publish [publish-skill rollback point]"
後続のいずれかのステップで公開に失敗した場合は、次のコマンドで復元します。
git checkout ".agents/skills/$skill_name/"
4. コードレビュー
code-reviewer エージェントを実行し、SKILL.md の差分(ローカル版と ai-skills 版)をレビューします。
レビューの重点:正確性、危険な bash がないこと、プロンプトインジェクションの経路がないこと。
P0/P1 の指摘事項がある場合 → 停止します。続行する前に修正してください。 P2 の指摘事項がある場合 → 記録しますが、作業はブロックしません。
5. ai-skills にコピーしてプッシュする
cp -r ".agents/skills/$skill_name" "$AI_SKILLS_PATH/skills/$skill_name"
git -C "$AI_SKILLS_PATH" add "skills/$skill_name"
git -C "$AI_SKILLS_PATH" commit -m "feat(skills): publish $skill_name"
すべてのスキルをコミットした後:
git -C "$AI_SKILLS_PATH" push
プッシュする前にユーザーの確認を得てください — これらのスキルを使用するすべてのリポジトリに影響します。
6. ローカルにインストールする
各スキルのスコープを検出します — 所属するロックファイルを確認します。
REPO_ROOT="$(git rev-parse --show-toplevel)"
if jq -e --arg n "$skill_name" '.skills[$n]' "$REPO_ROOT/dotfiles/skills-lock.json" >/dev/null 2>&1; then
SCOPE="user"
else
SCOPE="project"
fi
npx skills add は process.cwd() をインストール先として使用します。リンクされたワークツリーでは、CWD がワークツリーのルートであることを確認してください。
ソース仕様: ローカルファイルシステムのパスではなく、github の <owner>/<repo> 形式を使用します。ローカルパスを指定すると、sourceType: "local" とマシン固有の source を含むロックファイルエントリが生成され、ほかのリポジトリで使われている sourceType: "github" のエントリと競合し、マージが壊れます。マシン間で機能するよう、ai-skills のリモートから正規の仕様を検出します。
AI_SKILLS_SPEC=$(git -C "$AI_SKILLS_PATH" remote get-url origin \
| sed -E 's#(git@github\.com:|https://github\.com/|ssh://git@github\.com/|git://github\.com/)##; s#\.git$##; s#/$##')
# e.g. "camacho/ai-skills"
# Validate — bad spec must fail loudly, not silently re-introduce sourceType=local class of bug.
[[ "$AI_SKILLS_SPEC" =~ ^[^/]+/[^/]+$ ]] || { echo "bad spec: $AI_SKILLS_SPEC"; exit 1; }
cd "$REPO_ROOT"
if [ "$SCOPE" = "user" ]; then
npx skills add "$AI_SKILLS_SPEC" --skill "$skill_name" -g -y
else
npx skills add "$AI_SKILLS_SPEC" --skill "$skill_name" -y
fi
-a フラグは指定しません。 デフォルトのインストールでは、正規のコピーを .agents/skills/<n>/ に書き込み、Claude Code が検出に必要とする .claude/skills/<n> シンボリックリンクも作成します。Codex および npx skills CLI が認識するその他の「ユニバーサル」エージェントは、.agents/skills/<n>/ を直接読み取るため、ツール別のシンボリックリンクは不要です。-a codex を指定してもシンボリックリンクの作成には影響しません。-a claude-code を唯一のエージェント指定として渡すと、.claude/skills/<n>/ に破壊的なコピー(シンボリックリンクではありません)が作成され、正規ソースモデルが壊れます。デフォルトのインストール(-a を指定しない方法)だけが、正しい .agents/ の正規コピーと .claude/ のシンボリックリンクの構成を作成します。npx skills add のフラグの組み合わせを実験し、実証的に確認済み(2026-05-14)。
github 仕様では、ソースのコミットを先にプッシュする必要があります(ステップ 5 ですでにプッシュ済みです)。これにより、公開したばかりのコンテンツと同じものがインストールされます。
npx skills add は、適切な skills-lock.json を自動的に更新します。
7. 安全性ハッシュの確認
インストールした各スキルについて、次を実行します。
after_hash=$(git hash-object ".agents/skills/$skill_name/SKILL.md" 2>/dev/null)
after_hash を、ステップ 2 で記録した公開前の local_hash と比較します。
一致しない場合:
- 復元します:
git checkout ".agents/skills/$skill_name/" - ユーザーに通知します。停止します。
8. 追跡を解除してロックファイルをコミットする
for skill_name in $approved_skills; do
git rm --cached ".agents/skills/$skill_name/SKILL.md"
done
# Stage the lockfile that was updated (project or user)
git add skills-lock.json dotfiles/skills-lock.json 2>/dev/null || true
git commit -m "chore(skills): publish $approved_skills_csv — drop tracking, update lockfile"
LOCKFILE_SHA=$(git rev-parse HEAD)
9. ロックファイルのコミットを TARGET にチェリーピックする
デフォルトの TARGET=main です。競合を確認します。
git fetch origin "$TARGET"
git checkout "$TARGET"
git cherry-pick --no-commit "$LOCKFILE_SHA"
git status --porcelain
skills-lock.json で競合がある場合:停止します。ユーザーに状況を伝えてください。
競合がない場合:git cherry-pick --continue(または --no-commit の後に git commit)を実行し、プッシュします。
CI が停止している場合は、チェリーピックとプッシュの代わりに、BRANCH=current、TARGET=$TARGET を指定して /local-merge を実行します。
連携
置き換え対象: /elevate-skill(ローカルのみのスキルにしか対応していません)。
併用対象: /build-skill(新しいスキルを作成)および /local-merge(ステップ 9 で CI が停止している場合のフォールバック)。