mcpField
P
publish-skill

publish-skill

github.com/camachoエージェントワークフロー399 回インストール
リポジトリ

publish-skill について

publish-skillは、ローカルで編集したスキルをai-skillsリポジトリに公開し、プロジェクトへ再インストールするワークフロー用スキルです。レビュー、確認、ロールバック用スナップショット、ハッシュ照合で公開手順を管理します。

主な機能

  1. 01ai-skillsリポジトリの特定
  2. 02新規・変更スキルの検出
  3. 03公開前の変更レビュー
  4. 04公開スキルの導入とロックファイル更新
  5. 05保存したハッシュとの内容照合

活用シーン

  1. 01新規作成したスキルの公開
  2. 02共有スキルの更新
  3. 03公開済みスキルのプロジェクトへの導入
  4. 04公開・導入後の内容不一致への対処

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/camacho/ai-skills --skill publish-skill

インストール後、Claude Code で/publish-skillを入力して読み込まれたか確認します。

詳細

実行するタイミング

  • ユーザーが「スキルを公開」「スキルを更新」「スキルの変更をプッシュ」「/publish-skill」と言ったとき
  • .agents/skills/ 内のスキルをローカルで編集した後

手順

1. 事前確認

ai-skills のパスを次の順に特定します。

  1. $AI_SKILLS_REPO 環境変数
  2. ~/projects/camacho/ai-skills
  3. ユーザーに尋ねる

次に、作業ツリーがクリーンであることを確認します。

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 が停止している場合のフォールバック)。

コメント