CLAUDE.md ジェネレーター
コードベースを読み込み、Claudeが必要とする情報だけを過不足なく記述したCLAUDE.mdを生成します。
重要なルール: 優れたCLAUDE.mdは100行未満です。Claudeがコードを読むだけで導出できない情報のみを含めてください。ファイルを自動生成せず、常にドラフトを表示し、ユーザーの承認を待ってから書き込んでください。
コードスニペットのルール: CLAUDE.mdにはインラインのコード例を含めないでください。代わりに file.ts:42 のようなファイル参照を使用してください。CLAUDE.mdにコードを書くとトークンを浪費し、すぐに古くなります。
ステップ1: モードの判定
以下の3つのモードのいずれかを実行します:
create: CLAUDE.mdが存在しない場合。ゼロから作成します。 update: CLAUDE.mdが存在する場合。カスタムコンテンツを破棄せずに改善します。 audit: プロジェクト内のすべてのCLAUDE.mdファイルをA〜Fで評価し、品質レポートを出力します。ユーザーが「audit」「check」「review」「grade」と言った場合は監査モードを実行します。
# すべてのCLAUDE.mdの場所を検出
find . -name "CLAUDE.md" -not -path "*/node_modules/*" -not -path "*/.git/*" 2>/dev/null
ls ~/.claude/CLAUDE.md 2>/dev/null && echo "グローバルCLAUDE.mdが見つかりました"
ls .claude.local.md 2>/dev/null && echo ".claude.local.mdが見つかりました"
複数のCLAUDE.mdが見つかった場合:それらをリストアップし、「CLAUDE.mdが [場所] に見つかりました。すべて更新しますか、それとも [ルート] のみ更新しますか?」と尋ねます。
ステップ2: 監査モード(create/updateの場合はステップ3にスキップ)
見つかった各CLAUDE.mdを、以下のルーブリックを使用してA〜Fで評価します:
| 基準 | 確認事項 |
|---|---|
| コマンド | ビルド/テスト/リントコマンドが存在し、実行可能か? |
| アーキテクチャ | 非自明な構造が説明されているか? |
| 非自明なパターン | 落とし穴、生成ファイル、環境変数の順序が文書化されているか? |
| 簡潔さ | 100行未満か?明白な冗長部分がないか? |
| 最新性 | コマンドが現在のpackage.json/Makefileと一致しているか? |
| 実践性 | 新しいコントリビューターが質問せずに従える内容か? |
スコア: 90〜100 = A, 70〜89 = B, 50〜69 = C, 30〜49 = D, 0〜29 = F
テーブル形式で表示します:
## CLAUDE.md 監査レポート
| ファイル | スコア | 評価 | 主な問題 |
|---------|--------|------|----------|
| ./CLAUDE.md | 72 | B | 落とし穴セクションが欠落、テストコマンドが古い |
| ./packages/api/CLAUDE.md | 45 | D | コマンドなし、340行(長すぎ)、アーキテクチャメモが古い |
**全体: B (72/100)**
見つかった問題:
- ./packages/api/CLAUDE.md: 340行:100行目標を大幅に超過
- ./packages/api/CLAUDE.md: テストコマンドが `jest` を参照しているが、package.jsonは `vitest` を使用
- ./CLAUDE.md: 「落とし穴」セクションがない:最も価値のあるセクションが欠落
レポート後、「どれを修正しますか?(すべて / ルートのみ / 指定)」と尋ねます。
ユーザーが「はい」と答えた場合、修正する各ファイルについてステップ3に進みます。
ステップ3: プロジェクト構造のスキャン
# プロジェクトタイプとパッケージマネージャー
ls package.json yarn.lock pnpm-lock.yaml bun.lockb requirements.txt pyproject.toml Cargo.toml go.mod 2>/dev/null
# トップレベルのディレクトリ構造
find . -maxdepth 2 -type d \
| grep -v node_modules | grep -v .git | grep -v __pycache__ \
| grep -v ".next" | grep -v dist | grep -v build | sort
ステップ4: ビルドコマンドとテストコマンドの抽出
# npm/yarn/pnpm/bun スクリプト
cat package.json 2>/dev/null \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
for name, cmd in d.get('scripts', {}).items():
print(f'{name}: {cmd}')
"
# Python、Go、Rust の Makefile
cat Makefile 2>/dev/null | grep -E "^[a-z].*:" | head -20
# Go
cat go.mod 2>/dev/null | head -5
# Rust
cat Cargo.toml 2>/dev/null | grep -E "^\[" | head -10
ビルド、テスト(全)、テスト(単一ファイル/名前)、開発サーバー、リント/型チェックの正確なコマンドを特定します。それらの実行に必要な環境変数をメモします。
ステップ5: コードスタイルと落とし穴の発見
# インポートエイリアス(最も見落とされがち)
python3 -c "
import json, sys
try:
d = json.load(open('tsconfig.json'))
paths = d.get('compilerOptions', {}).get('paths', {})
if paths: print('Import aliases:', json.dumps(paths, indent=2))
except: pass
" 2>/dev/null
# 必要な環境変数
cat .env.example 2>/dev/null | grep -v "^#" | grep -v "^$" | head -20
# 自動生成ファイル(編集禁止)
find . -path "*/node_modules" -prune -o -name "*.ts" -print \
| xargs grep -l "DO NOT EDIT\|@generated\|Generated by" 2>/dev/null | head -5
# テストセットアップ要件
cat jest.config.js jest.config.ts vitest.config.ts 2>/dev/null | head -30
# データベース/マイグレーションセットアップ
ls migrations/ prisma/ drizzle/ db/ 2>/dev/null
「落とし穴」と見なすもの(これらを含め、それ以外はスキップ):
- 自動生成ファイル(編集禁止)
- テスト実行前に必要な環境変数
- デフォルト以外のインポートエイリアス設定
- 実行中のサービスを必要とするテストコマンド
- 既知の意図的な変則(ワークアラウンド、バグではない)
ステップ6: Gemini で CLAUDE.md ドラフトを生成
すべての調査結果をまとめてドラフトを生成します:
cat > /tmp/claude-md-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "ソフトウェアプロジェクトのCLAUDE.mdファイルを作成してください。ルール:(1) 合計100行未満。(2) Claudeがコードを読むだけでは導出できない情報のみを含める。(3) インラインコード例は使わず、代わりにfile.ts:42のようなファイル参照を使用する。(4) セクション: コマンド, コードスタイル(デフォルト以外のみ), テスト(セットアップが必要な場合のみ), 落とし穴(必須:人を躓かせるもの)。非自明なことを何も言うことがないセクションは省略する。(5) すべてのコマンドはコードブロック内に記述。(6) 推奨順序: 簡潔なプロジェクト概要(1〜2文、非自明な場合のみ), コマンド, アーキテクチャ(非自明な構造のみ), コードスタイル, テスト, 落とし穴。(7) ダッシュ(—)は使用しない。(8) CLAUDE.mdの内容のみを出力し、コメントは付けない。"
}]
},
"contents": [{
"parts": [{
"text": "PROJECT_ANALYSIS_HERE"
}]
}],
"generationConfig": {
"temperature": 0.3,
"maxOutputTokens": 2048
}
}
ENDJSON
curl -s -X POST \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d @/tmp/claude-md-request.json \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
PROJECT_ANALYSIS_HERE をステップ3〜5の調査結果に置き換えます。
大規模プロジェクト(ファイル数50以上)の場合: インラインの詳細の代わりに、CLAUDE.mdの末尾に @path ポインタを追加します:
## 拡張リファレンス
完全なモジュールマップについては @docs/ai-context/architecture.md を参照。
統合テストセットアップの詳細については @docs/ai-context/testing.md を参照。
参照ファイルは docs/ai-context/ に、100行に収まらなかった詳細とともに書き込みます。
ステップ7: 自己QA
ドラフトを提示する前に、以下を確認します:
- 100行未満(カウント:
echo "$CONTENT" | wc -l) - インラインコード例がない(
file.ts:42参照またはシェルコマンドのみ) - すべてのコマンドがコードブロック内にあり、そのまま実行可能
- 「落とし穴」セクションがあり、少なくとも1つの実際の項目が含まれている
- ファイルから自明なことしか書かれていないセクションがない
- ダッシュ(—)が使われていない
- マーケティング用語や冗長なフレーズがない(「このプロジェクトはReactを…」など)
- インポートエイリアスがあれば文書化されている
- 自動生成ファイルがあれば「編集禁止」とマークされている
いずれかのチェックに失敗した場合、提示前に修正します。
ステップ8: ドラフトの提示と承認待ち
ユーザーの承認なしにファイルを書き込まないでください。
ドラフトをコードブロックで提示します:
## CLAUDE.md ドラフト([N] 行)
[ドラフト全文]
---
この内容をCLAUDE.mdに書き込みますか?(yes / edit first / cancel)
ユーザーが yes と答えた場合:ファイルを書き込み、「CLAUDE.mdを書き込みました([N] 行)。セクション:[## ヘッダーのリスト]。」と確認します。
ユーザーが edit first と答えた場合:編集を適用し、ドラフトを再表示します。
ユーザーが cancel と答えた場合:停止します。
含めないもの
- 言語/フレームワークのバージョン(「これはTypeScriptプロジェクトです」)
- フレームワークの動作方法(ClaudeはReact、FastAPIなどをすでに知っています)
- すべての依存関係のリスト
- リンターですでに強制されているスタイルルール(インデントサイズ、引用符スタイル)
- README.mdと重複する内容
- インラインコード例や複数行スニペット
- 同じスタックを使用するすべてのプロジェクトで同一になる内容