開発ワークフローの設定

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

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

前回の記事で Claude Code のインストールと認証が完了しました。この記事では、Claude Code の権限設定(settings.json)と行動ルール(CLAUDE.md)の雛形を作成し、専用ユーザーに配置して、Git リポジトリの初期化まで行います。

作業が終わると、Claude Code が「何をしていいか」「どう振る舞うか」のルールが定義され、Git リポジトリとして管理できる状態になります。ファイル同期やコミット連携は次の記事で設定します。

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

# 専用ユーザーに切り替え
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

雛形ファイルの作成

Claude Code の設定ファイルは、新しいプロジェクト(専用ユーザー)を作るたびに配置が必要です。管理ユーザーのホームに雛形を用意しておき、そこからコピーする運用にします。

# 管理ユーザーで実行
mkdir -p ~/cc-template/claude-global
mkdir -p ~/cc-template/claude-project/.claude
~/cc-template/
├── claude-global/
│   └── CLAUDE.md          ← グローバル行動ルール
└── claude-project/
    ├── .claude/
    │   └── settings.json  ← 権限設定
    └── CLAUDE.md           ← プロジェクト固有の行動ルール

以下、各ファイルの内容を説明します。

settings.json(権限設定)

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

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

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

この環境では、OS レベルの制限(UFW、コマンド制限)に加えて、Claude Code のレイヤーでも危険な操作をブロックします。deny に入れておくことで、Claude Code は「そのコマンドは使えない」と最初から分かっているため、実行を試みてエラーになる無駄を防げます。例えば curl は UFW のアウトバウンド制限でブロックされますが、deny に入れていないと Claude Code は curl を実行し、タイムアウトを待ち、リトライを試みる…といった無駄な処理が発生します。deny に入れておけばそもそも実行しません。

~/cc-template/claude-project/.claude/settings.json を作成します。

vi ~/cc-template/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-global.md(グローバル行動ルール)

全プロジェクトに共通する行動ルールを記載するファイルです。Claude Code はセッション開始時にこのファイルを読み込み、記載されたルールに従って作業を進めます。以下のような内容を記載します。

  • 環境の制約 — 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 が読み込む場所

ファイルの内容はプロジェクトの方針に合わせて作成してください。このシリーズでは以下の内容で作成します。

vi ~/cc-template/claude-global/CLAUDE.md

以下の内容を貼り付けて保存してください。

# 共通ルール(全プロジェクト共通)

> 最終更新日(共通): 2026-03-17

> 本ナレッジは PHP / MySQL を中心としたWEBシステム開発を主な対象とする。周辺言語や目的に派生するプロジェクトにも適用する場合がある。

## あなたについて

- WEBシステムのエキスパート(PHP / MySQL / HTML / CSS / JavaScript に精通)
- 何ごとも疑ってかかる性格
- 言われたことを正確に応えたい性格
- 想像は含まず事実だけで判断する
- 足りない情報は要求する

## この環境の制約

- sudo 権限なし。システムの設定変更はできない
- curl / wget / ssh / scp / sftp / nc は使用不可
- chmod / chown は使用不可
- docker / systemctl / service は使用不可
- プロジェクトディレクトリ外のファイルを読み書きしない
- 上記の制約を回避しようとしないこと

## ファイルの編集権限

### 原則

- `push-to-ubuntu` でメインPCから送られるファイルは、承認者が管理するファイルである
- これらのファイルは `settings.json` の `deny` ルールで Read / Write / Edit がブロックされている
- Claude Code が編集してよいのは、プロジェクト固有のコードのみ

### push-to-ubuntu と settings.json の一致

- `push-to-ubuntu` の対象と `settings.json` の `deny` 対象は常に一致している必要がある
- どちらか一方だけを更新すると、意図しない読み取りや書き込みが発生する
- この同期管理は承認者が行う。Claude Code 側から `settings.json` を変更しない

### 編集禁止の対象

以下のファイル・ディレクトリは変更してはいけない(WordPress の例):

- WordPress 本体(`wp-admin/`、`wp-includes/`、`wp-*.php`、`index.php`)
- プラグイン(`wp-content/plugins/`)
- アップロードファイル(`wp-content/uploads/`)
- `vendor/`
- `settings.json` 自体

### 他のプロジェクトへの適用

上記は WordPress の例だが、この原則は Composer のライブラリや他の CMS・フレームワークにも同様に適用する。CMS 本体・外部ライブラリ・自動生成物はすべて編集禁止の対象である。

## コーディングの進め方

基本的な流れは次のとおり。

1. イシュー内容を受け取る
2. イシューをもとにブランチ名を考える
3. 関連するファイルを確認する
4. コーディングの概要・方向性を考える
5. コーディング
6. `.claude/sync-ready` に現在日時を書き出す

それぞれ指示するので、勝手に次の工程に進まないこと。

## ファイル同期のルール

- 作業が一区切りついたら、`.claude/sync-ready` に現在日時(`Y-m-d H:i:s` 形式)を書き出すこと
- 承認者がメインPCで rsync 同期し、VS Code で diff を確認する
- コミットは承認者がメインPC側で行う。あなたは git commit しない
- git push もしない
- `.gitignore` は変更しない。変更が必要な場合は承認者に提案すること

## commit-msg.txt の書き方

承認者から依頼があったときのみ、コミットメッセージを `.claude/commit-msg.txt` に書き出す。依頼があるまでは書き出さないこと。

### フォーマット

(#イシュー番号) タイトル(簡潔に)

詳細説明(箇条書き、または短文を複数行)

- 1行目:簡潔なタイトル。末尾にIssue番号を付ける(指示がなければ省略)
- 2行目:空行
- 3行目以降(省略可):詳細めに箇条書き

### 対象範囲

- `.claude/commit-msg.txt` の対象は、前回依頼時から今回の依頼までに行った変更内容
- 依頼があるまで `.claude/commit-msg.txt` を書き出さない

### 文体・ルール

- 文体は「である調」で統一する(〜しました ✕ → 〜である ○)
- お客様から見て何がどう変わったかを書く
- 「背景」や「目的」などの説明は基本的に省く(お客様からの指示に基づく場合は特に)
- どの画面・機能に影響があるのか、何ができるようになったのかを簡潔に伝える
- 表現は簡潔に。一文は短く。端的に「○○を□□に対応」のように書く
- 箇条書きの場合、文末の「。」は付けない(統一感を保つため)
- 技術用語(JS・HTML・APIなど)や処理単位(関数、変数名、IDなど)の代わりに画面・機能単位で書く
- 詳細は3行程度を目安にする

## ブランチの命名規則


## コーディングルール

CLAUDE.md(プロジェクト固有の行動ルール)

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

vi ~/cc-template/claude-project/CLAUDE.md

今回はサンプルとして最低限の内容にしています。

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

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

## プログラム環境

- PHP 8.1 系
- MySQL 8.0 系

専用ユーザーへの配置

雛形ファイルが揃ったら、管理ユーザーから専用ユーザーのプロジェクトディレクトリにまとめてコピーします。

# 管理ユーザーで実行

# ディレクトリ作成
sudo mkdir -p /home/<専用ユーザー名>/project/.claude

# settings.json のコピー
sudo cp ~/cc-template/claude-project/.claude/settings.json /home/<専用ユーザー名>/project/.claude/settings.json

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

# プロジェクト CLAUDE.md のコピー
sudo cp ~/cc-template/claude-project/CLAUDE.md /home/<専用ユーザー名>/project/CLAUDE.md

# 所有者を専用ユーザーに変更
sudo chown -R <専用ユーザー名>:<専用ユーザー名> /home/<専用ユーザー名>/project/

# 例:
# sudo mkdir -p /home/cc-sample-wp/project/.claude
# sudo cp ~/cc-template/claude-project/.claude/settings.json /home/cc-sample-wp/project/.claude/settings.json
# sudo cp ~/cc-template/claude-global/CLAUDE.md /home/cc-sample-wp/project/.claude/CLAUDE-global.md
# sudo cp ~/cc-template/claude-project/CLAUDE.md /home/cc-sample-wp/project/CLAUDE.md
# sudo chown -R cc-sample-wp:cc-sample-wp /home/cc-sample-wp/project/

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

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

Git リポジトリの初期化

プロジェクトディレクトリを Git リポジトリとして初期化します。その前に、メインPC 側で .gitignore を作成しておきます。

.gitignore の作成(メインPC側)

.gitignore はメインPC 側で管理するファイルです。プロジェクトルートに以下の内容で作成してください。案件固有の除外ルール(WordPress など)は後の記事で追加していきます。

#################################################################
# .local
#################################################################

/.local/*
!/.local/*.sample

/.local-cc/


#################################################################
# .claude
#################################################################

/.claude/settings.local.json
/.claude/commit-msg.txt
/.claude/sync-ready


#################################################################
# eclipse
#################################################################

# /.buildpath
# /.project
# /.settings


#################################################################
# Le'ts Encrypt
#################################################################
.well-known


#################################################################
# files
#################################################################

**/*.psd
**/*.ai
**/*.log
**/.DS_Store
**.crx
**.pem


#################################################################
# app
#################################################################

.local/.sample だけ Git に含め、実際の設定ファイルは除外しています。.local-cc/(Ubuntu 向け設定)も除外対象です。Eclipse のプロジェクト設定はコメントアウトしているので、使用する場合はコメントを外してください。末尾の # app セクションは、案件固有の除外ルールを追加する場所です。

リポジトリの初期化(Ubuntu側)

メインPC で作成した .gitignore は、この時点ではまだ Ubuntu 側にはありません。rsync の同期対象からも除外しているため、Ubuntu 側の Git リポジトリにはメインPC から push-to-ubuntu で送る必要があります。ただし、push-to-ubuntu の設定はまだ行っていないため、ここではまず .gitignore なしで初期コミットを行います。

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 は除外しています。

現在の状態まとめ

ここまでで、開発ワークフローの土台が整いました。

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

次の記事では、rsync によるファイル同期の仕組みを構築し、日々の開発サイクルを回せる状態にします。