CLAUDE.md, memory และ settings — สอนโปรเจกต์ให้ Claude Code ครั้งเดียว

⏱ 20 นาทีลองในClaude ↗

⚠️ บทนี้มีข้อมูลที่เปลี่ยนบ่อย (ฟีเจอร์ ราคา ชื่อเมนู) ตรวจกับเว็บทางการก่อนนำไปใช้

เป้าหมาย

เขียน CLAUDE.md สั้นแต่ได้ผล วางไว้ถูกที่ และใช้ settings.json ล็อกสิ่งที่ "ห้ามทำ" จริงๆ

CLAUDE.md = Project instructions ของโปรเจกต์โค้ด

โหลดเข้า context อัตโนมัติทุก session (เหมือน Project/Gem ระดับ 4 แต่อยู่ในไฟล์)

ไฟล์ ใช้กับ commit?
~/.claude/CLAUDE.md ทุกโปรเจกต์ของคุณ (สไตล์ส่วนตัว) ไม่
./CLAUDE.md หรือ ./.claude/CLAUDE.md ทั้งทีมในโปรเจกต์นี้ ใช่
./CLAUDE.local.md คุณคนเดียวในโปรเจกต์นี้ (ใส่ .gitignore) ไม่
โฟลเดอร์ย่อย/CLAUDE.md โหลดเมื่อ Claude แตะไฟล์ในโฟลเดอร์นั้น ใช่
.claude/rules/*.md กฎแยกเรื่อง ใส่ paths: ให้ใช้เฉพาะไฟล์ที่ตรง ใช่

ตัวอย่าง .claude/rules/api.md — โหลดเฉพาะตอนทำงานกับไฟล์ API

---
paths:
  - "src/app/api/**/*.ts"
---
- ทุก route ต้องตรวจ input ด้วย zod และคืน error เป็น JSON `{ "error": "..." }`

ทุกไฟล์ถูก ต่อกัน (ไม่ทับกัน) · ดึงไฟล์อื่นมาด้วย @path เช่น ดูคำสั่ง npm ที่ @package.json · Claude อ่าน AGENTS.md ได้ด้วย

ใส่อะไร / ไม่ใส่อะไร

ใส่ ✅ ไม่ใส่ ❌
คำสั่ง build/test/lint ที่ถูกต้อง เอกสารยาวทั้งเล่ม (ใช้ @ หรือ rules แทน)
ข้อตกลงที่เดาไม่ได้จากโค้ด สิ่งที่ linter บังคับอยู่แล้ว
กับดัก (gotchas) ที่เคยพัง API key, รหัสผ่าน, URL ภายในที่ลับ
ขั้นตอนก่อนส่งงาน คำทั่วไปแบบ "เขียนโค้ดให้ดี"

สั้นไว้ — ทุกบรรทัดกิน context ทุก session ถ้า Claude ทำผิดซ้ำค่อยเพิ่มกฎ ถ้ากฎไหนไม่เคยมีผลก็ลบ

CLAUDE.md แนะนำ ≠ บังคับ

CLAUDE.md เป็นแค่คำแนะนำ Claude อาจพลาดได้ สิ่งที่ "ห้ามเด็ดขาด" ให้ใช้ permission rules ใน settings.json (หรือ hooks ในระดับ 6d) — deny ชนะทุกโหมด

  • .claude/settings.json = ของทีม (commit) · .claude/settings.local.json = ส่วนตัว · ~/.claude/settings.json = ทุกโปรเจกต์

Auto memory และ /context

  • Claude จดโน้ตเองได้ (MEMORY.md) โหลดช่วงต้นทุก session ดู/แก้ด้วย /memory — ตรวจเป็นระยะ ลบสิ่งที่ผิดหรือลับ
  • /context ดูว่าตอนนี้อะไรกิน context อยู่บ้าง (CLAUDE.md, ไฟล์, ประวัติ) · /init ให้ Claude ร่าง CLAUDE.md จากโค้ด

⚠️ ต้องตรวจสอบ: ขนาด auto memory ที่โหลด (ปัจจุบันราว 200 บรรทัดแรก) และชื่อคำสั่งใน code.claude.com/docs

ลองเลย 🧪

ทดลอง A — ตัวอย่าง CLAUDE.md โปรเจกต์ Next.js เล็กๆ (บันทึกเป็น CLAUDE.md ที่ root แล้วแก้ให้ตรงโปรเจกต์คุณ)

# ร้านกาแฟออนไลน์ (Next.js + TypeScript)

ภาพรวมโปรเจกต์ดูที่ @README.md

## คำสั่ง
- `npm run dev` — รันเครื่อง local ที่ http://localhost:3000
- `npm test` — unit test (Vitest) ต้องผ่านก่อนส่งงานทุกครั้ง
- `npm run lint && npm run typecheck` — รันหลังแก้โค้ดเสมอ

## ข้อตกลง
- โค้ดหน้าเว็บอยู่ `src/app/`, ฟังก์ชันใช้ร่วมอยู่ `src/lib/`
- ราคาเก็บเป็นสตางค์ (integer) ห้ามใช้ float กับเงิน
- ข้อความที่ผู้ใช้เห็นเป็นภาษาไทย อยู่ใน `src/content/th.json` ห้าม hardcode

## กับดัก
- อย่าแก้ไฟล์ใน `src/generated/` (สร้างจาก `npm run codegen`)
- ตัวแปร env ฝั่ง browser ต้องขึ้นต้น `NEXT_PUBLIC_` และห้ามใส่ความลับ

## ก่อนส่งงาน
1. รัน test + lint + typecheck ให้ผ่าน
2. สรุปไฟล์ที่เปลี่ยนและเหตุผล
3. ห้าม commit/push เอง ให้ผู้ใช้ตรวจ diff ก่อน

ทดลอง B — ล็อกไม่ให้อ่าน .env และอนุญาตคำสั่งที่ใช้บ่อย (.claude/settings.json)

{
  "permissions": {
    "allow": ["Bash(npm run test *)", "Bash(npm run lint *)"],
    "deny": ["Read(./.env)", "Read(./.env.*)", "Bash(git push *)"]
  }
}

→ เปิด claude ใหม่ แล้วสั่ง อ่านไฟล์ .env ให้หน่อย — ต้องถูกปฏิเสธ · ดูกฎที่ใช้อยู่ด้วย /permissions

ทดลอง C — ให้ Claude ตรวจ CLAUDE.md ของตัวเอง

อ่าน CLAUDE.md ของโปรเจกต์นี้ แล้วเทียบกับโค้ดจริง:
1) คำสั่งไหนผิดหรือไม่มีอยู่จริง 2) กฎไหนซ้ำกับที่ linter บังคับอยู่แล้ว
3) กับดักอะไรที่ควรเพิ่ม (ดูจาก git log และโครงโปรเจกต์) เสนอฉบับใหม่ที่สั้นลง ยังไม่ต้องแก้ไฟล์

→ พิมพ์ /context ก่อนและหลังแก้ ดูว่า CLAUDE.md กินพื้นที่เท่าไร

สรุปจำง่าย

CLAUDE.md สั้น บอกสิ่งที่เดาไม่ได้ — สิ่งที่ห้ามเด็ดขาดใส่ deny ใน settings.json ความลับไม่อยู่ในทั้งสองที่