開発ワークフローとファイル同期の設定

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

前回の記事で Claude Code のインストールと認証が完了しました。この記事では、Claude Code の権限設定(settings.json)、行動ルール(CLAUDE.md)の配置、Git リポジトリの初期化、rsync によるファイル同期の仕組み、コミットメッセージの連携まで、開発に必要なワークフローを一通りセットアップします。

作業が終わると、Claude Code で作業 → メインPC に自動同期 → VS Code で差分確認 → コミット、という日々の開発サイクルが回せる状態になります。

この記事で行った設定が正しく反映されているか確認するコマンドをまとめておきます。詳細については本文をご覧ください。

# ---------------------------------------
# 管理ユーザーで実行
# ---------------------------------------

# sudoers の確認
sudo cat /etc/sudoers.d/rsync-sync

# ---------------------------------------
# 専用ユーザーで実行
# ---------------------------------------

# 切り替え
sudo su - <ユーザー名>

# settings.json の確認
cat ~/project/.claude/settings.json

# グローバル CLAUDE.md の確認(シンボリックリンク)
ls -la ~/.claude/CLAUDE.md
head -5 ~/project/.claude/CLAUDE-global.md

# プロジェクト CLAUDE.md の確認
head -5 ~/project/CLAUDE.md

# Git リポジトリの確認
cd ~/project && git log --oneline

settings.json による権限設定

settings.json は Claude Code が「何をしていいか」を定義する権限設定ファイルです。配置場所によってスコープが変わります。

  • ~/.claude/settings.json — ユーザーグローバル設定(全プロジェクト共通)
  • ~/project/.claude/settings.json — プロジェクト固有設定(Git に含めてチームで共有可能)

今回はプロジェクト側に配置します。リポジトリをクローンすれば設定が付いてくるので、他の環境でも同じ権限設定が自動的に適用されます。グローバル側(~/.claude/settings.json)は、このシリーズでは使用しません。プロジェクトの種類によって権限設定が異なる可能性があるため、プロジェクト単位で管理する方針です。

deny ルールの設計

この環境では、OS レベルの制限(UFW、コマンド制限)に加えて、Claude Code のレイヤーでも危険な操作をブロックします。deny に入れておくことで、Claude Code は「そのコマンドは使えない」と最初から分かっているため、実行を試みてエラーになる無駄を防げます。

例えば curl は UFW のアウトバウンド制限でブロックされますが、deny に入れていないと Claude Code は curl を実行し、タイムアウトを待ち、リトライを試みる…といった無駄な処理が発生します。deny に入れておけばそもそも実行しません。

settings.json の作成

専用ユーザーに切り替えて、プロジェクトディレクトリ内に作成します。

# 専用ユーザーに切り替え
sudo su - cc-sample-order

# ディレクトリ作成
mkdir -p ~/project/.claude

以下の内容で ~/project/.claude/settings.json を作成します。

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "deny": [
      "Bash(sudo:*)",
      "Bash(su:*)",
      "Bash(chmod:*)",
      "Bash(chown:*)",
      "Bash(rm -rf:*)",
      "Bash(curl:*)",
      "Bash(wget:*)",
      "Bash(ssh:*)",
      "Bash(scp:*)",
      "Bash(sftp:*)",
      "Bash(nc:*)",
      "Bash(ncat:*)",
      "Bash(nmap:*)",
      "Bash(docker:*)",
      "Bash(systemctl:*)",
      "Bash(service:*)",
      "Read(../**)",
      "Read(/etc/**)",
      "Read(/home/**/.credentials.json)"
    ],
    "allow": [
      "Read",
      "Glob",
      "Grep",
      "LS"
    ]
  }
}

deny には、OS レベルの権限昇格(sudo / su)、ファイル操作(chmod / chown / rm -rf)、ネットワーク系コマンド(curl / wget / ssh 等)、プロジェクト外の読み取りを指定しています。allow にはファイルの読み取り系(Read / Glob / Grep / LS)を入れています。コードを読む操作は頻繁に発生するため、毎回確認が出ると作業にならないからです。

それ以外の操作(Write、Edit、Bash の通常コマンドなど)は都度確認(ask)になります。

CLAUDE.md の配置

CLAUDE.md は Claude Code が「どう振る舞うか」を定義する行動ルールファイルです。Claude Code はセッション開始時にこのファイルを読み込み、記載されたルールに従って作業を進めます。

CLAUDE.md は階層構造を持っており、配置場所によってスコープが変わります。

  • ~/.claude/CLAUDE.md — ユーザーグローバル設定。全プロジェクトに自動適用される
  • ~/project/CLAUDE.md — プロジェクト固有設定。案件ごとの環境や固有ルールを記載する

Web 版の Claude(claude.ai)では、共通ルールを各プロジェクトにコピーする必要がありましたが、Claude Code ならグローバル側に1回書けば全プロジェクトに適用されます。

グローバル設定(CLAUDE-global.md)

全プロジェクトに共通するルールを記載します。コーディング規約、コミットメッセージの書き方、この環境の制約事項、ファイル同期のルールなどです。

主なポイントは以下のとおりです。

  • 環境の制約 — sudo 不可、curl 不可、プロジェクト外の読み書き不可など、settings.json の deny と連動する内容を記載。Claude Code が制約を理解した上で作業できるようにする
  • コーディングの進め方 — 各工程を指示するまで勝手に次に進まないこと、を明記。承認者が制御する前提
  • ファイル同期のルール — 作業が一区切りついたら .claude/sync-ready に現在日時を書き出すこと。commit-msg.txt は指示があるまで書き出さないこと。.gitignore は変更せず、変更が必要な場合は承認者に提案すること
  • git commit / git push はしない — コミットは承認者がメインPC側で行う

グローバル CLAUDE.md は Git で管理するため、プロジェクトの .claude/CLAUDE-global.md に正本を配置します。~/.claude/CLAUDE.md からはシンボリックリンクで参照します。

/home/shinohara/cc-template/claude-global/CLAUDE.md  ← 大元の正本(管理者が編集)
    │
    │ sudo cp(管理者が実行)
    ▼
~/project/.claude/CLAUDE-global.md  ← プロジェクト内のコピー(Git 管理)
    │
    │ シンボリックリンク
    ▼
~/.claude/CLAUDE.md  ← Claude Code が読み込む場所

シンボリックリンクの作成は以下のとおりです(専用ユーザーで実行)。

ln -s ~/project/.claude/CLAUDE-global.md ~/.claude/CLAUDE.md

プロジェクト設定(~/project/CLAUDE.md)

案件ごとに異なる情報を記載します。PHP のバージョン、MySQL のバージョン、プロジェクト固有のブランチ命名規則や CSS/JS の配置ルールなどです。今回はサンプルとして最低限の内容にしています。

# プロジェクト固有ルール

> 最終更新日(固有): 2026-03-15

## プログラム環境

- PHP 8.1 系
- MySQL 8.0 系

雛形ディレクトリの作成

CLAUDE.md と settings.json は、新しいプロジェクト(専用ユーザー)を作るたびに配置が必要です。管理ユーザーのホームに雛形を用意しておき、そこからコピーする運用にします。

# 管理ユーザーで実行
mkdir -p ~/cc-template/claude-global
mkdir -p ~/cc-template/claude-project/.claude

雛形の構成は以下のとおりです。

~/cc-template/
├── claude-global/
│   └── CLAUDE.md          ← .claude/CLAUDE-global.md にコピー
└── claude-project/
    ├── .claude/
    │   └── settings.json  ← ~/project/.claude/settings.json にコピー
    └── CLAUDE.md           ← ~/project/CLAUDE.md にコピー

各ファイルを雛形ディレクトリに配置したら、専用ユーザーへのコピーは以下のように行います。

# グローバル CLAUDE.md のコピー
sudo cp ~/cc-template/claude-global/CLAUDE.md /home/<専用ユーザー名>/project/.claude/CLAUDE-global.md
sudo chown <専用ユーザー名>:<専用ユーザー名> /home/<専用ユーザー名>/project/.claude/CLAUDE-global.md

# 例:
# sudo cp ~/cc-template/claude-global/CLAUDE.md /home/cc-sample-order/project/.claude/CLAUDE-global.md
# sudo chown cc-sample-order:cc-sample-order /home/cc-sample-order/project/.claude/CLAUDE-global.md

# プロジェクトファイルのコピー
sudo cp ~/cc-template/claude-project/CLAUDE.md /home/<専用ユーザー名>/project/CLAUDE.md
sudo cp ~/cc-template/claude-project/.claude/settings.json /home/<専用ユーザー名>/project/.claude/settings.json
sudo chown <専用ユーザー名>:<専用ユーザー名> /home/<専用ユーザー名>/project/CLAUDE.md /home/<専用ユーザー名>/project/.claude/settings.json

# 例:
# sudo cp ~/cc-template/claude-project/CLAUDE.md /home/cc-sample-order/project/CLAUDE.md
# sudo cp ~/cc-template/claude-project/.claude/settings.json /home/cc-sample-order/project/.claude/settings.json
# sudo chown cc-sample-order:cc-sample-order /home/cc-sample-order/project/CLAUDE.md /home/cc-sample-order/project/.claude/settings.json

# シンボリックリンクの作成(専用ユーザーに切り替えて実行)
sudo su - <専用ユーザー名>
ln -s ~/project/.claude/CLAUDE-global.md ~/.claude/CLAUDE.md

# 例:
# sudo su - cc-sample-order
# ln -s ~/project/.claude/CLAUDE-global.md ~/.claude/CLAUDE.md

Git リポジトリの初期化

プロジェクトディレクトリを Git リポジトリとして初期化し、初期コミットを行います。Git の user.name と user.email は、すべての専用ユーザーで共通の値を使います。Claude Code が書いたコードであることが Git ログから分かるようにするためです。

# 専用ユーザーで実行
cd ~/project

# Git の初期設定
git config --global user.name "claude-code"
git config --global user.email "claude-code@example.com"

# リポジトリの初期化
git init

# デフォルトブランチを main に変更
git branch -m main

# 初期コミット
git add .
git commit -m "初期設定ファイルを配置"

.gitignore はメインPC側で承認者が管理します。Claude Code は .gitignore を変更せず、変更が必要な場合は承認者に提案する形をとります。rsync の同期対象からも .gitignore は除外しています。

rsync によるファイル同期

Claude Code が作業を完了すると、.claude/sync-ready に現在日時を書き出します。メインPC(Windows)側の監視スクリプトがこのファイルを検知し、rsync で自動的にファイルを取得します。同期が完了すると sync-ready は削除され、Beep 音で通知されます。

Claude Code が作業完了
    │
    ▼
.claude/sync-ready に日時を書き出す
    │
    ▼
メインPC の監視スクリプトが検知(5秒間隔)
    │
    ▼
rsync で Ubuntu → メインPC にファイルを同期
    │
    ▼
sync-ready を削除
    │
    ▼
Beep 音で通知
    │
    ▼
VS Code / Eclipse で差分を確認

rsync の接続は管理ユーザー経由で行います。プロジェクトごとに専用ユーザーが分かれていても、接続先は管理ユーザーに統一できるため、SSH の鍵管理がシンプルになります。

同期対象のルール

rsync は include 方式で必要なファイルだけを同期対象にしています。メインPC側にある Ubuntu に関係のないファイル(Eclipse の設定ファイルなど)は影響を受けません。

対象ルール説明
/CLAUDE.md同期するプロジェクト固有ルール
/.claude/**すべて同期するsettings.json、CLAUDE-global.md、commit-msg.txt、sync-ready 等
/.local/*.sample.sample のみ同期する設定サンプルだけ Git に含め、実際の設定は各環境で作成
/_scripts/**すべて同期する同期スクリプト等の運用ツール
.gitignore同期しない承認者がメインPC側で管理する
上記以外同期しない今後ソースコードのディレクトリを追加していく

sudoers の設定

管理ユーザーで rsync を実行する際、専用ユーザーのホームディレクトリ(パーミッション 700)にアクセスするため sudo が必要です。sync-ready の存在確認(test)と削除(rm)にも sudo が必要です。パスワード入力なしで実行できるよう、対象コマンドを NOPASSWD に設定します。

sudo visudo -f /etc/sudoers.d/rsync-sync

エディタは nano が開きます。以下の内容を入力してください。

<管理ユーザー名> ALL=(ALL) NOPASSWD: /usr/bin/rsync, /usr/bin/rm, /usr/bin/test

# 例:
# shinohara ALL=(ALL) NOPASSWD: /usr/bin/rsync, /usr/bin/rm, /usr/bin/test

nano の操作は Ctrl + O → Enter で保存、Ctrl + X で終了です。保存後、確認しておきます。

sudo cat /etc/sudoers.d/rsync-sync

パスワードなしで sudo rsync が実行できることを確認します。

sudo rsync --version | head -1

同期スクリプトの構成

メインPC(Windows)側に3つのスクリプトを配置します。プロジェクトのリポジトリ内に _scripts\_sync_claude_code\ ディレクトリを作成し、その中に置きます。

_scripts\_sync_claude_code\
├── sync-watch.cmd       ← ダブルクリックで起動するエントリーポイント
├── sync-watch.ps1       ← 監視ループ本体(PowerShell)
└── sync-pull.cmd        ← rsync 実行

sync-watch.cmd はダブルクリックで起動するエントリーポイントです。PowerShell のスクリプト実行ポリシーを回避するため、-ExecutionPolicy Unrestricted を付けて ps1 を起動します。

sync-watch.ps1 が監視ループの本体です。SSH 経由で sync-ready の存在を確認し、検知したら sync-pull.cmd を呼び出して rsync を実行します。起動時に sync_claude_code_running ファイルが自動作成され、このファイルを削除するとループが停止します。別のプロセスが既に動いている場合は、起動時にエラーを表示して中断します。

sync-pull.cmd は Cygwin の rsync を使ってファイルを同期します。include 方式で必要なファイルだけを同期対象にしているため、メインPC側にある Ubuntu に関係のないファイルは影響を受けません。

設定ファイルの分離

SSH の接続情報や rsync のパスは、プロジェクトごとに異なります。これらをスクリプトにハードコードすると Git に含められなくなるため、設定ファイルとして分離します。

設定ファイルは .local\ ディレクトリに配置し、.gitignore で Git 管理から除外します。Git には .sample ファイルを含めておき、新しい環境ではそれをコピーして値を書き換える運用です。

.local\
├── _sync_claude_code_config.env          ← 実際の設定(Git 管理外)
└── _sync_claude_code_config.env.sample   ← サンプル(Git に含める)

設定ファイルの形式は KEY=VALUE(env 形式)です。PowerShell と cmd の両方から読み込めます。

SSH_USER=shinohara
SSH_HOST=192.168.xxx.xxx
SSH_KEY=C:\users\sample\ssh\id_ed25519
SSH_REMOTE_SYNC_READY=/home/cc-sample-order/project/.claude/sync-ready
RSYNC_USER=shinohara
RSYNC_HOST=192.168.xxx.xxx
RSYNC_KEY=C:\users\sample\ssh\id_ed25519
RSYNC_REMOTE_DIR=/home/cc-sample-order/project
RSYNC_LOCAL_DIR=/cygdrive/c/projects/sample/cc-sample-order/cc-sample-order
RSYNC_DRY_RUN=1
RSYNC_VERBOSE=1
CHECK_INTERVAL=5
設定項目説明
SSH_USER / SSH_HOST / SSH_KEYSSH 接続情報。sync-ready の存在確認と削除に使用
SSH_REMOTE_SYNC_READYsync-ready ファイルのフルパス
RSYNC_USER / RSYNC_HOST / RSYNC_KEYrsync の接続情報。SSH と同じ値になることが多い
RSYNC_REMOTE_DIRUbuntu 側の同期元ディレクトリ
RSYNC_LOCAL_DIRメインPC側の同期先ディレクトリ(Cygwin パス)
RSYNC_DRY_RUN1 でドライラン(実際のコピーなし)、0 で本番
RSYNC_VERBOSE1 で rsync のファイル一覧を表示、0 で非表示
CHECK_INTERVALsync-ready のチェック間隔(秒)

動作確認

まず RSYNC_DRY_RUN=1 の状態で動作確認を行います。Ubuntu 側で手動で sync-ready を作成して、メインPC側の監視スクリプトが検知・同期・削除まで正しく動くことを確認します。

Ubuntu 側(専用ユーザーで実行):

date '+%Y-%m-%d %H:%M:%S' > ~/project/.claude/sync-ready

メインPC側で sync-watch.cmd をダブルクリックして監視を開始します。以下のような出力が表示されれば成功です。

sync-ready の監視を開始しました(5秒間隔)
対象: shinohara@192.168.1.3:/home/cc-sample-order/project/.claude/sync-ready
モード: ドライラン(実際のファイルコピーは行いません)
停止するには sync_claude_code_running を削除してください

[2026-03-16 12:02:07] sync-ready 検知
"-------- rsync start (DRY RUN) --------"
receiving incremental file list
./
CLAUDE.md
.claude/
.claude/CLAUDE-global.md
.claude/settings.json
.claude/sync-ready

sent 180 bytes  received 206 bytes  772.00 bytes/sec
total size is 836  speedup is 2.17 (DRY RUN)
"-------- rsync end --------"
[2026-03-16 12:02:08] sync-ready 削除完了
[2026-03-16 12:02:08] 同期完了

確認ができたら、設定ファイルの RSYNC_DRY_RUN0 に変更して本番モードに切り替えます。

commit.template の設定

Claude Code にコミットメッセージの作成を依頼すると、.claude/commit-msg.txt にメッセージが書き出されます。rsync で同期された後、このファイルを Git の commit.template に設定しておくと、VS Code や Eclipse のコミット画面にメッセージが自動的にプリフィルされます。

メインPC側の Git リポジトリで以下を実行します。

# commit-msg.txt の空ファイルを作成(テンプレート参照エラーの防止)
type nul > .claude\commit-msg.txt

# commit.template の設定
git config --local commit.template .claude/commit-msg.txt

確認します。

git config --local commit.template
.claude/commit-msg.txt

これで、Claude Code が作成したコミットメッセージがコミット画面に自動表示されるようになります。内容を確認し、必要に応じて修正してからコミットします。

スナップショットの取得

ここまでの設定が完了したら、VMware でスナップショットを取得しておきます。

スナップショット名: 2026-03-16_workflow-setup

この時点の状態は以下のとおりです。

  • settings.json(権限設定)配置済み
  • CLAUDE.md(グローバル + プロジェクト)配置済み
  • CLAUDE-global.md を Git 管理化(シンボリックリンクで ~/.claude/CLAUDE.md に連携)
  • Git リポジトリ初期化・初期コミット済み
  • rsync 同期スクリプト動作確認済み
  • commit.template 設定済み
  • 雛形ディレクトリ(~/cc-template/)作成済み

次の記事では、この環境に WordPress 案件のための LAMP 環境を追加構築していきます。