mcpField
S
swain-update

swain-update

github.com/cristoslcエージェントワークフロー2125 回インストール25 週間前に更新
リポジトリ

swain-update について

swain-updateは、ローカルのswainスキルを更新し、ガバナンス設定を整えるエージェントスキルです。導入済みのプラットフォームを検出し、変更ファイルを退避してスキルを導入し、各バージョンを報告します。

主な機能

  1. 01導入済みエージェントプラットフォームの検出
  2. 02ローカルで変更されたスキルファイルの退避
  3. 03npxで導入し、失敗時はGitにフォールバック
  4. 04ガバナンス設定の調整
  5. 05導入済みスキルのバージョン報告

活用シーン

  1. 01既存のswainスキル環境の更新
  2. 02新しい環境へのswainスキル導入
  3. 03更新時のローカル変更の保護と確認

インストール

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

$npx skills add https://github.com/cristoslc/swain --skill swain-update

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

同梱ファイルreferences/agent-platforms.json

詳細

Swain の更新

swain スキルのローカルインストールを最新バージョンに更新し、ガバナンス設定を調整します。

ステップ 1 — 現在のインストール状況を確認する

.claude/skills/ に swain-* ディレクトリがあるか確認します。

ls -d .claude/skills/swain-* 2>/dev/null

swain スキルのディレクトリが見つからない場合は、新規インストールのようであり、更新ではないことをユーザーに伝えてから、そのまま続行します。以下の手順はどちらの場合にも使用できます。

ステップ 2 — ローカルの変更をバックアップする

スキルディレクトリを上書きする前に、保持すべきユーザーによる変更がないか確認します。

変更されたファイルを検出する

ローカルのスキルファイルを、インストール済みバージョンの git origin と比較します。

# Create a temporary reference copy
tmp=$(mktemp -d)
git clone --depth 1 https://github.com/cristoslc/swain.git "$tmp/swain" 2>/dev/null

# Find locally modified files
modified_files=()
for skill_dir in .claude/skills/swain-*/; do
  skill_name=$(basename "$skill_dir")
  ref_dir="$tmp/swain/skills/$skill_name"
  [ -d "$ref_dir" ] || continue

  while IFS= read -r file; do
    rel="${file#$skill_dir}"
    ref_file="$ref_dir/$rel"
    if [ -f "$ref_file" ]; then
      if ! diff -q "$file" "$ref_file" >/dev/null 2>&1; then
        modified_files+=("$file")
      fi
    else
      # File exists locally but not in upstream — user-added file
      modified_files+=("$file")
    fi
  done < <(find "$skill_dir" -type f)
done
変更されたファイルをバックアップする

変更されたファイルが見つかった場合:

  1. バックアップディレクトリを作成します:.agents/update-backup/<ISO-date>/
  2. ディレクトリ構造を保持したまま、変更された各ファイルをコピーします
  3. ユーザーに「ローカルで変更されたファイルが N 個見つかりました — .agents/update-backup/<date>/ にバックアップしました」と伝えます
  4. 変更されたファイルを一覧表示します

変更されたファイルが見つからない場合は、この手順をスキップして続行します。

この手順で作成した参照用クローンは、ステップ 3 で代替ソースとして再利用できます。

ステップ 3 — インストール済みのエージェントプラットフォームを検出する

インストール前に、システムに存在するエージェントプラットフォームを検出します。これにより、サポート対象のすべてのプラットフォーム用にドットフォルダーのスタブを作成することを避けられます(GitHub issue #21 を参照)。

references/agent-platforms.json からエージェントプラットフォームのデータを読み込みます。agents 配列の各エントリには、name(skills CLI 識別子)、省略可能な command(CLI バイナリ)、および detection パス(HOME 設定ディレクトリ)があります。どちらかの確認に成功した場合、そのプラットフォームは検出されたものとします。always_include のエントリは無条件に追加します。

SKILL_DIR="$(find . .claude skills -path '*/swain-update/references' -print -quit 2>/dev/null | sed 's|/references$||')"
detected_agents=()

# Always-include platforms (we're running inside claude-code)
for name in $(jq -r '.always_include[]' "$SKILL_DIR/references/agent-platforms.json"); do
  detected_agents+=("$name")
done

# Detect remaining platforms via command -v or HOME dotfolder
while IFS= read -r entry; do
  name=$(echo "$entry" | jq -r '.name')
  cmd=$(echo "$entry" | jq -r '.command // empty')
  det=$(echo "$entry" | jq -r '.detection // empty')

  # Skip always-include (already added)
  for ai in "${detected_agents[@]}"; do [[ "$ai" == "$name" ]] && continue 2; done

  found=false
  if [[ -n "$cmd" ]] && command -v "$cmd" &>/dev/null; then
    found=true
  fi
  if [[ -n "$det" ]] && ! $found; then
    det_expanded=$(echo "$det" | sed "s|~|$HOME|g")
    det_expanded=$(eval echo "$det_expanded" 2>/dev/null)
    [[ -d "$det_expanded" ]] && found=true
  fi

  $found && detected_agents+=("$name")
done < <(jq -c '.agents[]' "$SKILL_DIR/references/agent-platforms.json")

検出されたエージェントから -a フラグを組み立てます。

agent_flags=""
for agent in "${detected_agents[@]}"; do
  agent_flags="$agent_flags -a $agent"
done

検出されたプラットフォームをユーザーに伝えます。

エージェントプラットフォームを N 個検出しました:claude-code、codex、gemini-cli、...

ステップ 4 — npx で更新する

検出されたエージェントのみを指定して、skills パッケージマネージャーを実行します。

npx skills add cristoslc/swain $agent_flags -s '*' -y

これにより、確認をスキップ(-y)し、検出されたプラットフォームのみにすべてのスキル(-s '*')がインストールされます。インストールされていないプラットフォーム用のドットフォルダーのスタブは作成されません。

npx が失敗した場合(コマンドが見つからない、ネットワークエラー、またはゼロ以外の終了コード)、直接 git clone する方法に切り替えます。

tmp=$(mktemp -d)
git clone --depth 1 https://github.com/cristoslc/swain.git "$tmp/swain"
# Detect skill install location
INSTALL_DIR=$(find . -maxdepth 2 -name "swain-doctor" -type d -print -quit 2>/dev/null | sed 's|/swain-doctor$||')
INSTALL_DIR="${INSTALL_DIR:-.claude/skills}"
cp -r "$tmp/swain/skills/"* "$INSTALL_DIR/"
rm -rf "$tmp"

ステップ 5 — ガバナンスを調整する

swain-doctor スキルを呼び出します。このスキルは、ガバナンスルールを検証し、レガシーのスキルディレクトリ(このリリースで名前が変更されたものを含む)を整理し、.tickets/ を検証して、git に紛れ込んだランタイムファイルの追跡を解除します。このスキルはべき等性があるため、更新後に毎回実行しても問題ありません。

ステップ 6 — 復元方法を案内する

ステップ 2 でファイルをバックアップした場合:

  1. バックアップしたファイルをパスとともに一覧表示します
  2. 各ファイルについて状況を説明します:
    • ユーザー追加の設定ファイル(例:config/yazi/yazi.toml):今後の更新後も保持されるよう、.agents/config/<skill-name>/ または swain.settings.json への移動を提案します
    • パッチ適用済みスクリプト:バックアップと新バージョンの差分を表示します。アップストリームのバージョンに修正が含まれている場合は、パッチが不要になったことを確認します。含まれていない場合は、パッチを再適用するかユーザーに確認します。
  3. ユーザーに「今後これを避けるには、カスタマイズを .agents/config/ または swain.settings.json に保存してください。これらは更新後も保持されます」と念押しします。

ステップ 7 — 結果を報告する

最新の git タグから現在のリリースバージョンを表示します。

release_tag=$(git tag --sort=-v:refname | head -1)
echo "swain ${release_tag:-(unreleased)}"

次に、インストール済みの swain スキルディレクトリを一覧表示し、それぞれのスキルのバージョンを SKILL.md のフロントマターから抽出します。

for skill in .claude/skills/swain-*/SKILL.md; do
  name=$(grep '^name:' "$skill" | head -1 | sed 's/name: *//')
  version=$(grep 'version:' "$skill" | head -1 | sed 's/.*version: *//')
  echo "  $name  v$version"
done

一覧をユーザーに表示し、更新が完了したことを確認します。

ステップ 2 でバックアップを作成した場合は、次の内容も表示します:「変更されたファイル N 個を .agents/update-backup/<date>/ にバックアップしました。復元方法についてはステップ 5 を参照してください。」

コメント