fandhe-ai/agent-cli-skills2 files

Update Docs

>

Specification
Skill ID
fandhe-ai/agent-cli-skills/update-docs
Publisher
fandhe-ai
Repository
agent-cli-skills
Installs
0
Files
2
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

fandhe-ai/agent-cli-skills/update-docsInstalls these files
  • SKILL.md
  • references/measurement-example.md

What this skill tells the agent

update-docs

コード変更に基づいて CLAUDE.md を更新し、_/.last-update-docs に記録します。

_/.last-update-docs ファイル形式

commit_hash=<hash>
commit_subject=<1行目>
commit_date=<ISO 8601>

このファイルは .gitignore で除外されローカル専用。

フロー

Step 1: 前回の更新コミットを確認する

_/.last-update-docs を読み込んで commit_hash を取得。 ファイルが存在しない場合は初回扱いとして直近のコミットを基準にする。

Step 2: 変更内容を確認する

git log <commit_hash>..HEAD --oneline
git diff <commit_hash>..HEAD --stat

変更されたファイルと内容を把握する。

Step 3: CLAUDE.md を更新する

Current Skills の更新

スキルを2系統に分けて列挙し、CLAUDE.md の ## Current Skills セクションと「リポジトリ管理スキル」セクションをそれぞれ更新する。

系統 A: 配布可能スキルの全列挙(カウント対象)

上流リポジトリ(skills/ を持つ)では skills/ を列挙する。skills/ を持たない消費側 リポジトリでは .agents/skills/ を列挙する(該当ディレクトリが無い場合も含めて空集合として 扱い、非ゼロ終了で手順を止めない)。

# -L で symlink を追従する(skills/<name> や .agents/skills/<name> がディレクトリへの
# symlink の場合でも SKILL.md を取りこぼさないため。classify_b の候補集合も -L 付きで
# 全列挙しており、-L 無しだと系統 A と B1 の計上件数が食い違う)。
if [ -d skills ]; then
  find -L skills -mindepth 2 -maxdepth 2 -name SKILL.md | sed -E 's#^skills/##; s#/SKILL.md$##' | sort
elif [ -d .agents/skills ]; then
  find -L .agents/skills -mindepth 2 -maxdepth 2 -name SKILL.md | sed -E 's#^\.agents/skills/##; s#/SKILL.md$##' | sort
fi
# いずれのディレクトリも無ければ何も出力しない(空集合。エラー終了しない)
  • スキル数のカウントを更新: ## Current Skills (N)(N は系統 A のみ)
  • カンマ区切りのスキル名一覧を更新
  • CLAUDE.md に ## Current Skills セクションが存在しない場合は新規作成する

系統 B: `.claude/skills/` / `.agents/skills/` 配下のスキルの全列挙(列挙対象。カウントの扱いは内訳による)

下記の -L 付き find は「.claude/skills/ と .agents/skills/ から見える全スキル」を 取りこぼしなく列挙するためのコマンドであり、後述「注意事項」にある -L 無しの find .claude/skills ... -type d(実ディレクトリだけの抽出。用途が異なる)とは別物。 用途の違いは「注意事項」節を参照。

# -L で symlink を追従し、.claude/skills/(symlink)と .agents/skills/(実体)の
# 両レイアウトを網羅する。SKILL.md を持つディレクトリのみを抽出し重複排除する。
# (npx skills add は .agents/skills/ に実体を置き .claude/skills/ から symlink する)
find -L .claude/skills .agents/skills -mindepth 1 -maxdepth 1 -type d \
  -exec test -f '{}/SKILL.md' ';' -print 2>/dev/null \
  | sed -E 's#.*/##' | sort -u

find -L で symlink を追従するため、.claude/skills/ 配下が symlink でも、また スキル実体が .agents/skills/ 側にある場合でも取りこぼさない(-type d 単独だと symlink エントリを除外してしまうため -L が必須)。-exec test -f '{}/SKILL.md' ';' はシェル再展開を経由しないため、ディレクトリ名に空白等が含まれても安全。

系統 B の各エントリは実体の所在でさらに 3 分類され、## Current Skills (N) の N に含めるかどうかはこの内訳で決まる(系統 B という区分自体がカウントの可否を 決めるわけではない)。

分類は「.claude/skills/<name> 自身が symlink か」「.agents/skills/<name> 自身が symlink 先か」といった symlink の位置では判定しない。.claude/skills ディレクトリ自体が .agents/skills を指す symlink であるレイアウト(親 symlink 型)では、配下の .claude/skills/<name> は symlink ではなく実ディレクトリに見える(親越しに見える実体)ため、 symlink の有無を見る判定はこのレイアウトで成立しない。そこで判定基準を「.claude/skills/<name> から cd -P && pwd -P で物理解決した先が、skills/<name> または .agents/skills/<name> の 物理解決先と一致するか」に置き換える。この方式は親 symlink 型・子 symlink 型(.claude/skills/<name> 自身が symlink)・実ディレクトリ型のいずれでも同じロジックで判定できる。

系統 A の列挙元は skills/ の有無で切り替わる(Step 3 系統 A 参照)ため、B1/B3 の判定も skills/ ディレクトリ自体の有無で分岐する。上流レイアウト(skills/ あり。系統 A の 列挙元は skills/)と消費側レイアウト(skills/ なし。系統 A の列挙元は .agents/skills/) の 2 通りがあり、.agents/skills/<name> への一致がどちらに分類されるかが変わる。

区分実体の所在N に含めるか記載先
B1skills/<name>/(.claude/skills/<name> の物理解決先が skills/<name> の物理解決先と一致することを検証済み)。消費側レイアウトでは加えて .agents/skills/<name>/(.claude/skills/<name> の物理解決先が .agents/skills/<name> の物理解決先と一致することを検証済み)も B1 に含む(系統 A の列挙元が .agents/skills/ であるため、同じ実体への一致は系統 A で既に計上済み)含める(系統 A の列挙で既に計上済み。B1 を理由に N を増減させない)## Current Skills (N)
B2.claude/skills/<name>/ が SKILL.md を持つ実体で、skills/<name>/ にも .agents/skills/<name>/ にも該当せず、skills-lock.json にも掲載されていない含めない「リポジトリ管理スキル(.claude/skills/ に配置)」
B3上流レイアウト限定: .agents/skills/<name>/ が SKILL.md を持つ実体で、.claude/skills/<name> の物理解決先が .agents/skills/<name> の物理解決先と一致することを検証済み(.claude/skills/<name> 自身が symlink である子 symlink 型・.claude/skills 自体が symlink である親 symlink 型のいずれも該当)。skills/<name> とは別実体の参照スキルという位置づけのため、skills/ が存在する上流レイアウトでのみ成立する。消費側レイアウトでは同じ一致は B1 として扱う(B3 に該当するケースが存在しない)含めない「参照スキル(.claude/skills/ に配置)」
B4誤配置・判定不能(skills-lock.json 掲載の実ディレクトリ、物理解決先の不一致・到達不能、別ターゲットへの symlink、jq 不在でタイブレーク未実施 等)含めないCLAUDE.md には記載しない(stderr へ警告のみ。手動対応が必要な構成問題として扱う)

B1・B2・B3 の抽出コマンド(シェル関数として定義する。「検証」節でも同一の関数を呼び出すため、 コマンド本体はここに一度だけ記述する)。分類の核は単一の分類器 classify_b(名前ごとに排他的な 1 分類を出力する)に集約し、extract_b1・extract_b2・extract_b3 はその出力を区分でフィルタする 薄いラッパーとして定義する。既存の呼び出しインターフェース(Step 3・検証節で extract_b1/extract_b2/extract_b3 をそのまま呼び出す形)はこの変更後も変わらない。 いずれも「注意事項」のタイブレークを classify_b 自体に組み込んだ自己完結スクリプトとし、 分類ロジックと注意事項の記述が食い違わないようにする。判定できない・条件を満たさないケースは B1/B2/B3 から除外して stderr へ警告する(fail-closed)。除外分は B4 として扱い、下記の件数整合式で 回収する:

# 物理パス正規化ヘルパー。symlink(子 symlink 型・親 symlink 型)・実ディレクトリの
# いずれの経路で見えるエントリも `cd -P` で辿った物理パスへ正規化することで、
# symlink の位置に依存しない解決先ベースの判定を可能にする。
# 到達不能(エントリ不在・broken symlink)の場合は空文字列を返す。
resolve() { cd -P -- "$1" 2>/dev/null && pwd -P; }

# classify_b: 系統 B の各名前を B1/B2/B3 のいずれか 1 分類(該当しなければ B4 警告のみ)へ
# 排他的に振り分ける単一分類器。「名前ごとに 1 回だけ判定する」構造で排他性を保証する。
# 出力は "<区分>\t<名前>" 形式(B1/B2/B3 のみ。B4 は stdout に出さず stderr へ WARN する)。
#
# 候補集合: -L 付き全列挙(SKILL.md を持つディレクトリのみ)。「SKILL.md を持たない
# エントリは対象外(B4 にも計上しない)」の既存挙動は、この候補集合の構築自体で維持される。
#
# 判定順序(上から順・排他):
#   1. .claude/skills/<n> の物理解決先が空(エントリ不在・broken symlink)→ B4 警告
#   2. skills/<n> の物理解決先が非空 かつ 一致 → B1
#   3. skills/<n> の物理解決先が非空 かつ 不一致 → B4 警告(配布実体と解決先不一致)
#   4. .agents/skills/<n> の物理解決先が非空 かつ 一致 →
#        - skills/ ディレクトリが存在する(上流・二重役割レイアウト)→ B3
#          (親 symlink 型・子 symlink 型の双方をこの 1 条件で吸収する。skills/<n> とは
#          別実体の参照スキルという位置づけのため上流レイアウトに限定する)
#        - skills/ ディレクトリが存在しない(消費側レイアウト。系統 A の列挙元は
#          .agents/skills/ そのもの)→ B1(系統 A で既に計上済みの実体へのリンクであり、
#          B3 に分類すると A のカウントと矛盾する)
#   5. .agents/skills/<n> の物理解決先が非空 かつ 不一致 → B4 警告(参照/配布実体と解決先不一致)
#   6. .claude/skills/<n> の物理解決先が .claude/skills 自体の物理解決先直下(.claude/skills/<n>
#      と等価)→ B2 候補 → skills-lock.json タイブレーク(jq 不在→B4/jq exit 0→掲載あり
#      誤配置として B4/exit 1→B2/それ以外→解析失敗として B4。既存の B2 タイブレークをそのまま踏襲)
#   7. 上記いずれにも該当しない(別ターゲットへの symlink 等)→ B4 警告
classify_b() {
  find -L .claude/skills .agents/skills -mindepth 1 -maxdepth 1 -type d \
    -exec test -f '{}/SKILL.md' ';' -print 2>/dev/null \
    | sed -E 's#.*/##' | sort -u |
    while read -r n; do
      p=$(resolve ".claude/skills/${n}")
      if [ -z "${p}" ]; then
        echo "WARN: .claude/skills/${n} から実体へ到達できない(未配置・broken symlink 等。B4 扱い)" >&2
        continue
      fi

      s=$(resolve "skills/${n}")
      if [ -n "${s}" ]; then
        if [ "${p}" = "${s}" ]; then
          printf 'B1\t%s\n' "${n}"
        else
          echo "WARN: .claude/skills/${n} の解決先が skills/${n} と一致しない(B4 扱い)" >&2
        fi
        continue
      fi

      a=$(resolve ".agents/skills/${n}")
      if [ -n "${a}" ]; then
        if [ "${p}" = "${a}" ]; then
          # skills/ が存在しない消費側レイアウトでは .agents/skills/ が系統 A の
          # 列挙元そのものであるため、この一致は B3(参照スキル)ではなく B1
          # (系統 A で計上済みの実体へのリンク)として扱う。B3 のまま倒すと
          # 「A に含める」と「B3 は N に含めない」が矛盾する。
          if [ -d skills ]; then
            printf 'B3\t%s\n' "${n}"
          else
            printf 'B1\t%s\n' "${n}"
          fi
        else
          echo "WARN: .claude/skills/${n} の解決先が .agents/skills/${n} と一致しない(B4 扱い)" >&2
        fi
        continue
      fi

      c=$(resolve ".claude/skills")
      if [ -n "${c}" ] && [ "${p}" = "${c}/${n}" ]; then
        if [ -f skills-lock.json ]; then
          if ! command -v jq >/dev/null 2>&1; then
            echo "WARN: jq が見つからないため ${n} の skills-lock.json タイブレークを判定できない(B4 扱い。jq を導入するか手動確認する)" >&2
            continue
          fi
          jq -e --arg n "${n}" '.skills[$n] != null' skills-lock.json >/dev/null 2>&1
          jq_status=$?
          # jq の終了ステータスは 0=真(掲載あり)/ 1=偽(掲載なし)/ それ以外=実行時
          # エラー(不正な JSON 等)の3値。0/1 以外を「掲載なし」と誤読すると
          # 壊れた skills-lock.json のときに誤配置スキルが素通りして B2 に混入する

Use this skill in a project

Open any RiverX project, search the Skills panel for fandhe-ai/agent-cli-skills/update-docs, and install it in one click.

Use this skill