趙健の技術ノート

cclayer で複数の PC 間で Claude Code の設定(CLAUDE.md、skills、プラグイン、MCP)を同期し、チームごとに git の ID を分ける

技術 約5770文字 · 15分で読める - 回閲覧

Claude Code をしばらく使っていると、~/.claude にいろいろなものが溜まっていきます。グローバルの CLAUDE.md、各種 rules、skills、hooks、settings.json の権限やプラグイン、それに大量の MCP サーバー。私は普段何台かの PC で Claude Code を使っていて、そのたびに一から設定し直す必要がありました。どれか 1 台でルールを少し変えたら、他の PC でも手で同じ変更をしなければならず、時間が経つと各 PC の設定が食い違ってきます。

さらに面倒なのは、プロジェクトが別々のチームのものだということです。チームごとに git のコミット ID(ユーザー名とメールアドレス)が違い、独自のルールや hook を持つチームもあります。こうしたものはそのチームのプロジェクトの中だけで有効になるべきで、他のプロジェクトに混ざってはいけませんし、ましてや会社のメールアドレスで自分のオープンソースリポジトリにコミットするなんてことは避けたいところです。

かといって ~/.claude をそのまま git リポジトリに入れるわけにもいきません。ログイン状態やセッション履歴、そのマシン固有の権限設定が入っていますし、チームのものは公開リポジトリに置けません。そこで、この問題を解決するために cclayer を作りました。

cclayer とは

cclayer は Claude Code の設定を 2 種類の「レイヤー」に分けます。

  • ベースレイヤー:どの PC でも同じもの。CLAUDE.md、rules/、skills/、output-styles/、agents/、hook スクリプト、settings.json の共有キー、プラグインと marketplace の一覧、MCP の定義。ID 情報は一切含まないので、公開リポジトリに置けます。
  • オーバーレイ:チームごとに 1 つ。そのチームの git ID、hook、リポジトリ URL のルール(例:github.com/acme-inc/*)、そしてそれらのプロジェクトに書き込む .claude/settings.local.json と CLAUDE.local.md を置きます。オーバーレイはマッチしたプロジェクトでのみ有効になり、~/.claude には何も書き込みません。

各 PC はベースレイヤーと必要なオーバーレイだけを取得し、cclayer apply 1 つで展開、cclayer push 1 つでローカルの変更を送り返します。

レイヤーは git リポジトリでも、クラウドストレージの同期フォルダ内のディレクトリでも構いません。git を触りたくなくても使えます。

インストール

macOS では Homebrew を使います。

Terminal window
brew install --cask zhaojiannet/tap/cclayer

今後のアップグレード:

Terminal window
brew upgrade --cask cclayer

Linux と Windows は Releases ページ からバイナリをダウンロードしてください。事前に git のインストールが必要です。プラグインと MCP の手順には Claude Code 2.1.288 以上が必要です。

いちばんシンプルな使い方:1 人で数台の PC

分けるべきチームがなければ、ベースレイヤー 1 つで十分です。

1 台目の PC

Terminal window
cclayer setup

setup は全画面の設定画面です。左側にレイヤーとこのマシンの設定、右側に選択中の項目の説明と編集できるフィールドが表示され、保存するまでファイルは一切書き込まれません。画面の表示言語は簡体字中国語・英語・日本語に対応していて、デフォルトではシステムの言語に従います。

cclayer setup の全画面設定画面のスクリーンショット:左側にベースレイヤー、プロジェクトディレクトリ、ローカルのクローン先、自動プルなどの設定、右側に選択中の項目の説明、下部に「保存して適用」「保存のみ」「終了」ボタン

入力するのは 2 項目だけです。

  1. ベースレイヤー:ディレクトリ(例:クラウドストレージ内の ~/Dropbox/cclayer/base)か、非公開の git リポジトリの URL。ディレクトリがまだなければ、保存時にひな形の layer.toml が自動生成されます。
  2. プロジェクトディレクトリ:コードを置いているディレクトリ。例:~/Projects。

「保存して適用」を選んだら、この PC の既存の設定をレイヤーに取り込みます。

Terminal window
cclayer capture --add CLAUDE.md --add rules/ --add skills/

パスは ~/.claude からの相対パスです。取り込む前に各ファイルがチェックされ、シークレットやメールアドレス、ホームディレクトリを指す絶対パスなどはブロックされ、何行目にあるかが表示されます。自分専用でレイヤーも非公開の場所に置いている場合は、layer.toml の [layer] の下に private = true を 1 行追加すれば、メールアドレスはブロックされなくなります。

他の PC

cclayer をインストールし、同じく cclayer setup を実行して、ベースレイヤーに同じ場所を指定し「保存して適用」すれば、1 台目の PC の設定がそのまま入ります。ローカルにすでにあって内容が違うファイルは一覧表示され、上書きするかどうか聞かれます。上書き前の古いファイルは ~/.local/state/cclayer/backups/ にバックアップされます。

日々の同期

git リポジトリをレイヤーにしている場合:

Terminal window
cclayer push # アップロード:ローカルの変更を集め、コミット内容を一覧表示し、確認後にコミットしてプッシュ
cclayer apply --pull # ダウンロード:最新のレイヤーをプルしてからローカルに展開

クラウドストレージのディレクトリをレイヤーにしている場合は、同期はクラウドストレージに任せて、変更後に cclayer capture、もう一方の PC で cclayer apply を実行するだけです。

さらに、次の SessionStart hook をベースレイヤーの claude/settings.json に入れ、setup で「自動プル」をオンにしておくと、Claude Code のセッションを開くたびに自動でプルして適用されます。

{
"hooks": {
"SessionStart": [{
"matcher": "startup",
"hooks": [{ "type": "command", "command": "command -v cclayer >/dev/null && cclayer apply --hook || true" }]
}]
}
}

チームごとに異なる git ID を設定する

これが cclayer を作ったいちばんの理由です。まずチーム用の非公開リポジトリを作り、ルートに layer.toml を置いて、ID とマッチさせるリポジトリを書きます。

[layer]
name = "acme"
kind = "overlay"
[identity]
name = "Full Name"
email = "me@acme.example"
[[match]]
remote = "github.com/acme-inc/*"

次に、必要な PC でこのオーバーレイを追加します。リポジトリへのアクセス認証情報の設定方法を聞かれたあと、clone してチェックが行われます。

Terminal window
cclayer layer add acme git@github.com:you/cclayer-acme.git

apply すると、cclayer は ~/.gitconfig の末尾に include ブロックを追加し、git の includeIf "hasconfig:remote.*.url:..." を使って、リモート URL が github.com/acme-inc/* にマッチするリポジトリでだけこの ID が有効になるようにします。~/.gitconfig の既存の内容には一切手を触れません。デフォルト ID(default_identity)を空にしておくと、どのオーバーレイにもマッチしないリポジトリでは git がコミットを拒否するので、間違ったメールアドレスでコミットしてしまうことがなくなります。

マッチルールにはホストと組織を明記する必要があり、ワイルドカードで代用することはできません。あるチームのオーバーレイが別のチームのリポジトリを取り込んでしまうのを防ぐためです。

チームごとに Claude Code のログイン、セッション、プロンプト履歴まで完全に分けたい場合は、profiles モードをオンにします。各オーバーレイが専用の ~/.claude-profiles/<レイヤー名> 設定ディレクトリを持つようになり、cclayer env が対応する CLAUDE_CONFIG_DIR を出力するので、direnv と組み合わせればプロジェクトに入るだけでそのプロジェクト用の設定が使われます。

セキュリティ面の扱い

同期してきた hook や skills はローカルで Claude Code によって実行されるので、cclayer はこの点についてかなり慎重です。

  • hooks、statusLine、enabledPlugins のようにプログラムを実行したりプラグインを有効にしたりする設定、それに hooks/・skills/ 配下のファイルや実行権限付きのファイルは、書き込む前に内容を一覧表示して確認を求めます。同じ内容は一度確認すれば二度と聞かれません。
  • git の設定断片は pull.rebase、push.default のような一般的な設定だけを許可します。alias、core.hooksPath、credential.helper などプログラムを実行できるキーは、デバイスのマニフェストでそのレイヤーを明示的に信頼しないと使えません。
  • Claude Code のログイン状態、history.jsonl、projects/ はレイヤーに読み込まれず、permissions.allow と env はローカルに残ります。
  • レイヤー内にシンボリックリンクは置けず、ファイルを書き込むときもシンボリックリンクはたどりません。

よく使うコマンド

コマンド説明
cclayer setup全画面の設定画面。初回設定もその後の変更もこれで行う
cclayer apply各レイヤーをローカルに展開。--pull で先にプル
cclayer captureローカルの変更をレイヤーに書き戻す(コミットはしない)
cclayer pushcapture したうえで各レイヤーのリポジトリにコミットしてプッシュ
cclayer checkレイヤーに含まれてはいけない内容がないかチェック
cclayer status各レイヤーの git の状態とマッチしたプロジェクト
cclayer keys setup <レイヤー>このマシンにレイヤーのリポジトリへのアクセス認証情報を設定(deploy key または HTTPS token)
cclayer layer add <名前> <URL>このマシンにオーバーレイを追加
cclayer leave <レイヤー>このマシンからレイヤーを外し、書き込んだものを片付ける
cclayer doctorClaude Code と git のよくある問題をチェック

git リポジトリの作り方、非公開リポジトリの認証情報、よくある質問など、詳しい使い方は cclayer 日本語チュートリアル を参照してください。

GitHub リポジトリ: https://github.com/zhaojiannet/cclayer

共有:

コメント