swain-update について
swain-updateは、ローカルのswainスキルを更新し、ガバナンス設定を整えるエージェントスキルです。導入済みのプラットフォームを検出し、変更ファイルを退避してスキルを導入し、各バージョンを報告します。
主な機能
- 01導入済みエージェントプラットフォームの検出
- 02ローカルで変更されたスキルファイルの退避
- 03npxで導入し、失敗時はGitにフォールバック
- 04ガバナンス設定の調整
- 05導入済みスキルのバージョン報告
活用シーン
- 01既存のswainスキル環境の更新
- 02新しい環境へのswainスキル導入
- 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
変更されたファイルをバックアップする
変更されたファイルが見つかった場合:
- バックアップディレクトリを作成します:
.agents/update-backup/<ISO-date>/ - ディレクトリ構造を保持したまま、変更された各ファイルをコピーします
- ユーザーに「ローカルで変更されたファイルが N 個見つかりました —
.agents/update-backup/<date>/にバックアップしました」と伝えます - 変更されたファイルを一覧表示します
変更されたファイルが見つからない場合は、この手順をスキップして続行します。
この手順で作成した参照用クローンは、ステップ 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 でファイルをバックアップした場合:
- バックアップしたファイルをパスとともに一覧表示します
- 各ファイルについて状況を説明します:
- ユーザー追加の設定ファイル(例:
config/yazi/yazi.toml):今後の更新後も保持されるよう、.agents/config/<skill-name>/またはswain.settings.jsonへの移動を提案します - パッチ適用済みスクリプト:バックアップと新バージョンの差分を表示します。アップストリームのバージョンに修正が含まれている場合は、パッチが不要になったことを確認します。含まれていない場合は、パッチを再適用するかユーザーに確認します。
- ユーザー追加の設定ファイル(例:
- ユーザーに「今後これを避けるには、カスタマイズを
.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 を参照してください。」