
Sync Skills Lock
- 201 installs
- 1 repo stars
- Updated August 2, 2026
- fandhe-ai/agent-cli-skills
Helps with ai & agent building tasks.
About
sync-skills-lock is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- sync-skills-lock
- AI & Agent Building
- AI-coding skill
Sync Skills Lock by the numbers
- 201 all-time installs (skills.sh)
- Ranked #2,884 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/fandhe-ai/agent-cli-skills --skill sync-skills-lockAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 201 |
|---|---|
| repo stars | ★ 1 |
| Last updated | August 2, 2026 |
| Repository | fandhe-ai/agent-cli-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
sync-skills-lock
ルート直下の skills-lock.json の computedHash を、upstream リポジトリの現状と照合して更新する。
対象ファイル
- ルート: 呼び出し元リポジトリ直下の
skills-lock.json— このスキルが唯一編集するファイル - 除外: submodule 配下の
skills-lock.json— submodule 境界を跨がないため 絶対に触らない
前提条件
ghCLI がインストールされ、認証済みであることnode/npxが利用可能であること(npx skills addを使用するため)- ルート直下の
skills-lock.jsonが存在すること - 実行前に `skills-lock.json` に未コミットの変更がないこと(ステージ済み・未ステージ問わず)。本スキルの実行中に発生する変更は sync 由来のみとなり、
git add skills-lock.jsonで全体をステージしても無関係な変更が混入しない - 対象スキルの `.agents/skills/<name>/` に未コミット変更がないこと。
npx skills addは.agents/skills/<name>/を upstream の最新版で上書きするため、そのディレクトリに WIP が存在すると即座に失われる。git checkoutで戻せるのは「最後にコミットされた状態」のみであり、npx 実行前の未コミット編集は復元できない。未追跡ファイルとして存在する WIP も対象であり、git status --porcelainで検出する
フロー
Step 1: 引数を確認し、事前条件を検証する
TARGET="$ARGUMENTS" # 空なら全スキル対象
# 引数指定時は kebab-case のみ許可(パストラバーサル防止)
if [[ -n "${TARGET}" && ! "${TARGET}" =~ ^[a-z][a-z0-9-]+$ ]]; then
echo "エラー: スキル名は小文字 kebab-case のみ許可されています: ${TARGET}"
exit 1
fi引数ありの場合は該当スキルのみ処理、なしの場合は skills-lock.json の全エントリを対象にする。
次に skills-lock.json の clean 状態を確認する。未コミット変更(ステージ済み・未ステージ問わず)があれば中止する。
# skills-lock.json に未コミット変更があれば中止(sync 由来以外の変更の混入を防ぐ)
# git diff 系は untracked を検出しないため porcelain を使う
if [[ -n "$(git status --porcelain -- skills-lock.json)" ]]; then
echo "エラー: skills-lock.json に未コミットの変更があります。コミットまたは退避してから再実行してください。"
exit 1
fiStep 2: upstream 一覧を集計する
skills-lock.json を読み、source フィールドごとにスキルをグルーピングする(同一リポへの処理を 1 回にまとめるため)。
Fandhe-AI/agent-cli-skills:
- create-commit
- create-issue
- ...Step 3: source を検証する
安全弁: 処理前に必ず source フィールドが信頼された prefix で始まっていることを確認する。Fandhe-AI/ の短縮形と https://github.com/Fandhe-AI/ の URL 形式の両方を許可する。想定外の source は skip してユーザーに警告する。skills-lock.json の改ざん・誤設定によって untrusted リポジトリから clone することを防ぐためである。
case "$SOURCE" in
Fandhe-AI/*)
;; # 短縮形 OK
https://github.com/Fandhe-AI/*)
;; # URL 形式 OK
*)
echo "警告: 想定外の source: $SOURCE — このスキルは skip します"
continue
;;
esacStep 4–7: 対象スキルを1つずつ処理する(ループ)
対象スキルそれぞれについて、次の 4→5→6→7 を順に実行し、1スキル完了後に次スキルへ進む。全スキル sync であっても同時に複数スキルを処理せず、1スキルずつ完結させること。
Step 4: npx skills add で computedHash を更新する
sha256sum などで手動計算するのではなく、npx skills add に計算を任せる。これにより CLI の内部アルゴリズムと完全に一致する。
# 当該スキルの install ツリーに未コミット変更があれば npx が上書きするため skip
# git diff 系は untracked を検出しないため porcelain を使う(未追跡 WIP も保護対象)
if [[ -n "$(git status --porcelain -- ".agents/skills/${SKILL_NAME}/")" ]]; then
echo "警告: .agents/skills/${SKILL_NAME}/ に未コミット変更(未追跡含む)があります。npx の上書きで失われるため skip します。"
continue
fi
# CLI に computedHash を更新させる(--yes で確認プロンプトをスキップ)
npx skills add "${SOURCE}" --skill "${SKILL_NAME}" --yesnpx skills add は以下を行う:
- upstream の最新スキルをダウンロード
- インストール先(
.agents/skills/<name>/)を最新化 skills-lock.jsonのcomputedHashを CLI 算出値で更新
重要な副作用: npx skills add はインストール済みファイルを最新の upstream 版で上書きする。upstream との同期が目的のため、これは意図した動作である。上記の per-skill clean ガードは git status --porcelain を使い、ステージ済み・未ステージ・未追跡ファイルも含めて検出する。WIP がある場合は npx 実行前に skip するため、未コミット編集の消失は防止される。
注意: clean ガードを通過したスキルについては、npx が即座に skills-lock.json と .agents/skills/<name>/ を書き換える。ユーザー承認(Step 6)の前に変更が確定するため、承認しない場合は Step 6 の案内に従いリバートが必要。
Step 5: 当該スキルの差分を表示する
# 当該スキルにスコープした差分のみ表示する
git diff skills-lock.json ".agents/skills/${SKILL_NAME}/"変更点を確認し、更新された computedHash の内容をユーザーに提示する。
Step 6: ユーザーに当該スキルの承認を求める
差分がある場合のみ、ユーザーに「この更新を適用してよいか」を確認する。
却下された場合は当該スキルのみ即座にリバートして次スキルへ continueする(全体を中止しない):
# 当該スキルの変更のみをリバート(追跡ファイル)。
# git checkout -- <file> は HEAD ではなく「index(ステージ)」の内容を作業ツリーへ復元する。
# 前スキルの承認変更は git add で既に index に載っているため、checkout 後の作業ツリーにも
# 引き継がれ、承認済み computedHash が消えることはない。
git checkout -- skills-lock.json ".agents/skills/${SKILL_NAME}/"
# npx が新規作成した未追跡ファイルも削除(Step 4 の clean ガードで実行前は clean を保証済み)
# ${SKILL_NAME} は kebab-case 検証済みのため、対象は当該スキルディレクトリ配下に限定される
git clean -fd ".agents/skills/${SKILL_NAME}/"Step 4 の clean ガードにより npx 実行前の当該ディレクトリは clean(未追跡含む)であることが保証されているため、git clean で削除される未追跡ファイルは npx が作成したものに限られる。git clean の対象は kebab-case 検証済みの ${SKILL_NAME} 配下のみに限定されており、リポジトリ全体には影響しない。
このリバートは「次スキルの npx skills add 実行前」に行うため、skills-lock.json から戻るのは当該スキル分のみである。git checkout -- は HEAD ではなく index から復元するため、承認済みの他スキルの hash は index にも作業ツリーにも保持されており、影響を受けない。
Step 7: 承認されたスキルを stage する(ループ内で積み上げる)
# 当該スキルのファイルのみをステージング
git add skills-lock.json ".agents/skills/${SKILL_NAME}/"skills-lock.json は単一 JSON ファイルのため行単位での部分ステージは現実的でない。しかし Step 1 の事前ガードで実行開始時の clean 状態を保証しているため、ファイル全体をステージしても sync 由来の変更のみが含まれ、無関係な編集が混入することはない。このコマンドをループ内で実行することで、複数スキルの全スキル sync でも処理した全スキルが過不足なく stage に積み上がる。
Step 8: コミット提案(ループ後に1回だけ実行)
ループ完了後、stage 済みの全承認スキルをまとめて1コミットにする。
git commit -m "$(cat <<'EOF'
chore(skills-lock): upstream の最新ハッシュと同期
<変更内容の要約>
EOF
)"ユーザーにコミットしてよいか確認する。承認済みスキルが1つもなかった場合(全却下・差分なし)はコミットせずその旨を伝える。
注意事項
- 全スキル sync での途中却下: 1スキルずつ承認・stage を行うため、途中で却下しても承認済みスキルの stage は保持される。全スキル処理後に一括コミットする
- `skills-lock.json` は実行前 clean 前提で全体をステージする: 単一 JSON ファイルのため部分ステージは現実的でない。Step 1 の事前ガードで clean を保証し、sync 由来以外の変更の混入を防ぐ
- ルートの `skills-lock.json` のみを編集: submodule 配下は手を付けない
- source prefix 検証(必須):
sourceがFandhe-AI/またはhttps://github.com/Fandhe-AI/で始まらないエントリは skip する(contribute-skillと同じ安全弁)。skills-lock.jsonの改ざんや誤設定から防御するため - `npx skills add --yes` は上書き確認をスキップする: upstream に破壊的変更がある場合は
git diffで内容を必ず確認すること - 新スキルの取扱い: ローカルに存在するが upstream に未登録のスキル(
contribute-skill,sync-skills-lock自身など)は、upstream マージ後に登録する。マージ前にcomputedHashを勝手に書き込まない
sandbox 環境での実行
このスキルは sandbox 環境では実行できない。ネットワークアクセス・ファイルシステムへの書き込みが必要なため、通常の Claude Code セッションで実行すること。
検証
コミット後、以下で完了を確認する。
# skills-lock.json が更新済みであることを確認
git show HEAD -- skills-lock.json | grep computedHash
# 差分なし(sync 完了)を確認
git status --porcelain skills-lock.json- コミットに sync 対象スキルの
computedHash更新が含まれること - ステージ・未ステージに残留変更がないこと
既存スキルとの関係
contribute-skillでスキル改修が upstream にマージされた後に本スキルを実行する運用を推奨create-commitの Conventional Commits を踏襲(Step 8)- 実行可能コマンド集として
script/skills-lock-update.shを参照
#!/usr/bin/env bash
# skills-lock-update.sh — skills-lock.json の computedHash を npx skills add で更新する
#
# 使い方(リポジトリルートから実行):
# skills/sync-skills-lock/script/skills-lock-update.sh <skill-name> <source-repo>
# (インストール先からは .agents/skills/sync-skills-lock/script/skills-lock-update.sh)
# 例:
# skills/sync-skills-lock/script/skills-lock-update.sh github-docs Fandhe-AI/agent-reference-skills
#
# このスクリプトは sync-skills-lock スキルが使用する実例コマンド集。
# リポジトリルートから実行すること。
set -euo pipefail
SKILL_NAME="${1:-}"
SOURCE_REPO="${2:-}"
if [[ -z "$SKILL_NAME" || -z "$SOURCE_REPO" ]]; then
echo "使い方: $0 <skill-name> <source-repo>"
echo "例: $0 github-docs Fandhe-AI/agent-reference-skills"
exit 1
fi
# SKILL_NAME バリデーション: 小文字 kebab-case のみ許可(パストラバーサル防止)
if [[ ! "$SKILL_NAME" =~ ^[a-z][a-z0-9-]+$ ]]; then
echo "エラー: SKILL_NAME は小文字 kebab-case のみ許可されています: ${SKILL_NAME}" >&2
exit 1
fi
# source の安全弁: Fandhe-AI/ または https://github.com/Fandhe-AI/ のみ許可
case "$SOURCE_REPO" in
Fandhe-AI/*)
;;
https://github.com/Fandhe-AI/*)
;;
*)
echo "エラー: 想定外の source: $SOURCE_REPO — Fandhe-AI/ 以外の source は許可されていません"
exit 1
;;
esac
# skills-lock.json に source があれば SOURCE_REPO と照合する(誤 upstream 同期防止)
if command -v jq >/dev/null 2>&1 && [[ -f skills-lock.json ]]; then
LOCK_SOURCE=$(jq -r ".skills[\"${SKILL_NAME}\"].source // empty" skills-lock.json 2>/dev/null)
if [[ -n "${LOCK_SOURCE}" ]]; then
norm_lock="${LOCK_SOURCE#https://github.com/}"; norm_lock="${norm_lock%.git}"
norm_arg="${SOURCE_REPO#https://github.com/}"; norm_arg="${norm_arg%.git}"
if [[ "${norm_lock}" != "${norm_arg}" ]]; then
echo "エラー: 指定された source (${SOURCE_REPO}) が skills-lock.json の source (${LOCK_SOURCE}) と一致しません。中止します。" >&2
exit 1
fi
fi
fi
# gh CLI の認証確認
if ! gh auth status &>/dev/null; then
echo "エラー: gh CLI が認証されていません。gh auth login を実行してください。" >&2
exit 1
fi
echo "==> skills-lock.json を更新中: ${SKILL_NAME} (source: ${SOURCE_REPO})"
echo ""
# 更新前の computedHash を表示
echo "変更前の computedHash:"
SKILL_NAME_VAR="${SKILL_NAME}" python3 - <<'PYEOF'
import json, os, sys
skill = os.environ['SKILL_NAME_VAR']
try:
with open('skills-lock.json') as f:
lock = json.load(f)
skills = lock.get('skills', {})
if skill in skills:
print(skills[skill].get('computedHash', '(computedHash なし)'))
else:
print('(未登録)')
except FileNotFoundError:
print('(skills-lock.json が見つかりません)', file=sys.stderr)
sys.exit(1)
PYEOF
echo ""
# skills-lock.json の clean チェック(sync 由来以外の変更の混入を防ぐ)
# git diff 系は untracked を検出しないため porcelain を使う
if [[ -n "$(git status --porcelain -- skills-lock.json)" ]]; then
echo "エラー: skills-lock.json に未コミットの変更があります。コミットまたは退避してから再実行してください。" >&2
exit 1
fi
# 当該スキルの install ツリーの clean チェック(npx による WIP 上書きを防ぐ)
# git diff 系は untracked を検出しないため porcelain を使う(未追跡 WIP も保護対象)
if [[ -n "$(git status --porcelain -- ".agents/skills/${SKILL_NAME}/")" ]]; then
echo "エラー: .agents/skills/${SKILL_NAME}/ に未コミット変更(未追跡含む)があります。npx の上書きで失われるため中止します。コミットまたは退避してから再実行してください。" >&2
exit 1
fi
# npx skills add で CLI に computedHash を更新させる
# --yes / -y で確認プロンプトをスキップ
npx skills add "${SOURCE_REPO}" --skill "${SKILL_NAME}" --yes
echo ""
echo "==> 更新完了。変更内容:"
# install ツリーの上書きも確認するため、skills-lock.json と当該スキルの install ツリー両方を diff する
git diff skills-lock.json ".agents/skills/${SKILL_NAME}/"
echo ""
echo "コミットするには:"
echo " git add skills-lock.json"
echo " git add .agents/skills/${SKILL_NAME}/"
echo " git commit -m 'chore(skills-lock): ${SKILL_NAME} の computedHash を upstream と同期'"