Claude Code に「Next.js プロジェクト作って」と頼んだら、TypeScript の設定がゆるゆるで型エラーを出しまくるコードが生成された。僕が何度も試行錯誤しながら、CLAUDE.md に何を書けば意図通りに動くかを探り続けた記録だ。
「AI に任せたら雑なコードが出てきた」という経験は、指示の精度を上げることで解決できる。この記事では、CLAUDE.md の書き方から始まり、create-next-app の自動セットアップ、カスタムコマンド、pre-commit hook の設定、Vercel デプロイまでを1セッションで完走させる手順を紹介する。
Claude Code に Next.js 初期構築を任せると何が変わる?
手作業でやっていた Next.js の初期構築をざっと挙げると、こうなる。
create-next-appの実行と選択肢の入力- TypeScript の strict 設定
- Tailwind のインストールと設定ファイルの調整
- shadcn/ui の初期化
- ESLint / Prettier の設定
.gitignoreの整備src/ディレクトリ構成の整理
これらを毎回手作業でやるのは30〜60分かかる。Claude Code に任せると5〜10分で終わる。
ただし注意点がある。Claude Code は指示された通りにしか動かない。「なんとなくいい感じに」は通じない。どんな設定にしたいかを明確に言語化してから渡す必要がある。それを担うのが CLAUDE.md だ。
CLAUDE.md には最低限何を書けばいい?
プロジェクトルートに置く CLAUDE.md は、Claude Code がそのプロジェクトを理解するための設計書だ。最小限の構成はこれだ。
# プロジェクト名
## 技術スタック
- Next.js 15+ (App Router)
- TypeScript (strict: true)
- Tailwind CSS v4
- shadcn/ui
- ESLint + Prettier
## ディレクトリ構成
- `src/app/` — App Router のルート
- `src/components/` — UIコンポーネント
- `src/lib/` — ユーティリティ関数
- `src/types/` — 型定義
## コーディングルール
- コンポーネントは必ず TypeScript で書く
- `any` 型は使用禁止
- `interface` より `type` を優先
- Server Component をデフォルトとし、必要な場合のみ `"use client"` を付ける
## 禁止事項
- `src/` 外にコードを置かない
- CSS in JS の使用禁止(Tailwind を使う)
- `console.log` をそのままコミットしない
この程度でも、生成されるコードの品質が大きく変わる。特に「禁止事項」のセクションは重要で、明示しない限り Claude Code はゆるい設定でコードを書く。
create-next-app から shadcn/ui まで一気に自動セットアップするには?
CLAUDE.md が用意できたら、Claude Code に次のように指示する。
新規 Next.js プロジェクトを作成してください。
- プロジェクト名: my-app
- CLAUDE.md の技術スタックに従って設定してください
- create-next-app を実行し、その後 shadcn/ui の初期化まで完了させてください
Claude Code が実行するコマンドは以下のようになる。
npx create-next-app@latest my-app \
--typescript \
--tailwind \
--eslint \
--app \
--src-dir \
--import-alias "@/*"
ここで重要なのは、create-next-app の選択肢をフラグで明示的に指定させることだ。対話形式で進めると Claude Code が途中で詰まることがある。
セットアップ後、TypeScript の設定を厳格にする。
// tsconfig.json
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true
}
}
shadcn/ui・Tailwind v4・ESLint の設定を自動化するには?
shadcn/ui の初期化
npx shadcn@latest init
Claude Code に指示するとき、コンポーネントのスタイルとベースカラーを CLAUDE.md に書いておくと迷わない。
## shadcn/ui 設定
- style: default
- base color: slate
- CSS variables: 使用する
Tailwind CSS v4 の設定
v4 は設定ファイルの書き方が v3 と異なる。tailwind.config.ts ではなく、CSS ファイルに直接設定を書く方式になっている。
/* src/app/globals.css */
@import "tailwindcss";
@theme {
--color-primary: oklch(0.5 0.2 250);
--font-sans: "Inter", sans-serif;
}
Claude Code に v4 の記法で書くよう CLAUDE.md に明記しておかないと、v3 の設定ファイルを生成することがある。
## Tailwind CSS
- バージョン: v4
- 設定は globals.css の @theme に書く
- tailwind.config.ts は作成しない
ESLint の設定
// eslint.config.mjs
import { dirname } from "path";
import { fileURLToPath } from "url";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({ baseDirectory: __dirname });
export default [
...compat.extends("next/core-web-vitals", "next/typescript"),
{
rules: {
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-unused-vars": "error",
},
},
];
繰り返し作業をカスタムスラッシュコマンドで自動化するには?
Claude Code はカスタムのスラッシュコマンドをサポートしている。.claude/commands/ ディレクトリにマークダウンファイルを置くだけで使えるようになる。
コンポーネント生成コマンド
<!-- .claude/commands/component.md -->
# コンポーネント生成
$ARGUMENTS で指定されたコンポーネントを以下のルールで生成してください:
- ファイル: `src/components/$ARGUMENTS.tsx`
- TypeScript で書く
- shadcn/ui のスタイルに合わせる
- Props の型定義を必ず含める
- Storybook のストーリーファイル(.stories.tsx)も同時に生成する
使い方は Claude Code のチャットで /component Button と入力するだけだ。
ページ生成コマンド
<!-- .claude/commands/page.md -->
# ページ生成
$ARGUMENTS のページを App Router の規約に従って生成してください:
- `src/app/$ARGUMENTS/page.tsx` を作成
- Server Component として実装
- メタデータ(metadata export)を含める
- ローディング UI(loading.tsx)も生成する
よく使うパターンをコマンド化しておくと、毎回同じ指示を書かずに済む。
pre-commit hook とフォーマットはどう自動化する?
コードの品質を保つために、コミット前に自動チェックを走らせる。
Husky + lint-staged の設定
npm install -D husky lint-staged
npx husky init
.husky/pre-commit を設定する。
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
package.json に lint-staged の設定を追加する。
{
"lint-staged": {
"*.{ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"*.{css,md,json}": [
"prettier --write"
]
}
}
Claude Code にこれを設定させるとき、CLAUDE.md に以下を書いておく。
## 自動化
- pre-commit: husky + lint-staged でESLintとPrettierを実行
- TypeScriptのビルドエラーもpre-commitでチェックする
Prettier の設定
// .prettierrc
{
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100
}
Vercel デプロイまでを1セッションで完走させるには?
セットアップが終わったら、Vercel へのデプロイも Claude Code に指示できる。
まず Vercel CLI をインストールする。
npm install -g vercel
Claude Code に次のように指示する。
現在のプロジェクトを Vercel にデプロイしてください。
- プロジェクト名: my-app
- フレームワーク: Next.js
- ビルドコマンドはデフォルト設定を使用
- 環境変数は .env.local から読み込む
Vercel CLI を使ったデプロイコマンドは以下だ。
vercel --prod
環境変数がある場合は Vercel のダッシュボードで設定するか、CLI で追加する。
vercel env add NEXT_PUBLIC_API_URL production
GitHub リポジトリと連携すれば、以降は main ブランチへの push で自動デプロイされる。
Claude Code でよくある失敗パターンと回避策は?
CLAUDE.md を読み込まずに実行される
Claude Code を起動したとき、プロジェクトルートに CLAUDE.md があれば自動的に読み込まれる。ただし、サブディレクトリで起動した場合は読み込まれないことがある。必ずプロジェクトルートで claude を起動する。
指示が曖昧で意図と違うコードが生成される
「いい感じに」「ベストプラクティスで」という指示は通じない。「TypeScript の strict モードで、any は使わずに、Server Component として実装する」のように具体的に書く。
長いセッションでコンテキストが薄れる
1セッションが長くなると、最初に伝えたルールを忘れたかのような挙動をすることがある。CLAUDE.md のルールを守っているか確認し、ズレを感じたら「CLAUDE.md のルールに従って修正してください」と明示的に指示する。
ファイルが意図せず上書きされる
Claude Code はファイルを積極的に編集する。既存ファイルを壊されたくない場合は、CLAUDE.md に「〇〇ファイルは編集禁止」と明記する。
## 編集禁止ファイル
- `src/styles/design-tokens.css` — デザイントークンの定義(変更不可)
- `.env.local` — 環境変数(参照のみ)
まとめ
Claude Code で Next.js の初期構築を自動化するポイントは3つだ。
- CLAUDE.md で意図を正確に伝える: 技術スタック・ディレクトリ構成・禁止事項を明記する
- カスタムコマンドで繰り返し作業を排除する: よく使うパターンをコマンド化して再利用する
- pre-commit hook で品質を担保する: コードレビュー前に機械的なチェックを自動化する
最初の CLAUDE.md を書く30分の投資が、その後の開発効率を大きく左右する。テンプレートとして保存しておき、プロジェクトごとに調整していく使い方がおすすめだ。