ตั้งค่า Claude ให้เข้าใจโปรเจกต์คุณ: CLAUDE.md & .claude/
จนถึงตอนนี้เราสั่ง Claude ทีละครั้ง แต่ถ้าอยากให้มัน รู้จักโปรเจกต์คุณตั้งแต่ประโยคแรก
โดยไม่ต้องอธิบายซ้ำทุกครั้ง — นั่นคือหน้าที่ของ CLAUDE.md และโฟลเดอร์ .claude/
บทนี้กระชับ เน้นดูของจริงในโปรเจกต์นี้เป็นตัวอย่าง (teach-by-example / สอนด้วยตัวอย่างจริง)
CLAUDE.md คืออะไร ทำไมสำคัญ
CLAUDE.md คือ สิ่งแรกที่ Claude Code อ่าน เมื่อเปิดโปรเจกต์
มันคือ "บรีฟงาน" (project brief / สรุปงานให้ทีมใหม่) ที่ทำให้ Claude เข้าใจบริบททันที
และเนื้อหาในนี้จะ override (เขียนทับ / ลบล้าง) พฤติกรรมเริ่มต้นของ Claude
— พูดง่ายๆ คือคุณกำลัง "ตั้งกฎประจำโปรเจกต์" ให้มัน
องค์ประกอบที่ CLAUDE.md ที่ดีควรมี:
| ส่วน | บอกอะไร | ตัวอย่างสั้น |
|---|---|---|
| โปรเจกต์คืออะไร | ทำงานอะไร เพื่อใคร (1–2 ประโยค) | "REST API สำหรับระบบจอง" |
| Tech stack | ภาษา / framework / ฐานข้อมูล / เครื่องมือ | TypeScript, NestJS, PostgreSQL |
| วิธีรัน / เทสต์ | คำสั่งจริงที่ใช้ dev และ test | pnpm dev, pnpm test |
| Conventions | ธรรมเนียมโค้ด (จัดไฟล์, naming, error) | "จัดโค้ดตาม feature" |
| Guardrails | สิ่งที่ต้องทำ / ห้ามทำ (ราวกันตก) | "ห้าม commit ถ้าไม่สั่ง" |
เพราะ CLAUDE.md override พฤติกรรมเริ่มต้น จึงต้องเขียนอย่างตั้งใจ —
อย่าใส่สิ่งที่ไม่จริง เช่น เขียนว่า pnpm test ทั้งที่โปรเจกต์ใช้ npm test
Claude จะเชื่อและทำผิดตาม ให้เขียนสั้นแต่ เป็นความจริงทั้งหมด
เขียน CLAUDE.md ที่ดี: สั้น มีสาระ เป็นจริง
หลักคือ high-signal (สาระแน่น น้ำน้อย) — Claude อ่านมันทุกครั้ง ยิ่งยาวเกินจำเป็น ยิ่งเปลือง context และกลบสิ่งสำคัญ เขียนเท่าที่ช่วยให้ทำงานถูก แล้วลบส่วนที่ไม่เกี่ยวออก
- สั้น: เลือกเฉพาะสิ่งที่ Claude ต้องรู้จริงๆ ไม่ใช่ยกคู่มือทั้งเล่มมาวาง
- เป็นจริง: คำสั่ง/พาธ/กติกา ต้องตรงกับของจริง ตรวจก่อนใส่
- เจาะจง: "จัดโค้ดตาม feature ไม่ใช่ตามชนิดไฟล์" ดีกว่า "เขียนโค้ดให้สะอาด"
🔎 เปิดดูของจริง 2 ไฟล์นี้ควบคู่ไปด้วย: CLAUDE.md ของโปรเจกต์นี้ (สังเกตว่ามันบอกบทบาท "ครู", โปรไฟล์ผู้เรียน, กติกาไฟล์ ครบแต่ไม่ยืดเยื้อ) และ เทมเพลตเปล่า EN/CLAUDE.template.md ที่เอาไปเริ่มโปรเจกต์อื่นได้
โครงร่าง (skeleton) ของเทมเพลตหน้าตาแบบนี้ — เริ่มจากตรงนี้แล้วเติมของจริงลงไป:
# CLAUDE.md — <ชื่อโปรเจกต์>
<!-- สั้น มีสาระ เป็นจริง — อะไรที่นี่ override default ของ Claude -->
## What this project is
<ทำงานอะไร เพื่อใคร 1–2 ประโยค>
## Tech stack
- Language(s): TypeScript, Go
- Framework(s): NestJS
- Data: PostgreSQL, MongoDB
## How to run / test
```bash
pnpm install
pnpm dev
pnpm test
```
## Project conventions
- จัดโค้ดตาม feature ไม่ใช่ตามชนิดไฟล์
- ใช้ immutable data — คืน object ใหม่แทนการ mutate
## Guardrails (ต้องทำ / ห้ามทำ)
- DO: เขียน test ที่ fail ก่อน แล้วค่อย implement
- DON'T: commit หรือ push ถ้าไม่ได้สั่ง
โครงสร้าง .claude/ เต็มรูปแบบ
CLAUDE.md คือ "บรีฟ" ส่วนโฟลเดอร์ .claude/ คือ "กล่องเครื่องมือ" ประจำโปรเจกต์
ที่ทำให้ Claude ทำงานเฉพาะทางได้ แต่ละโฟลเดอร์ย่อยมีหน้าที่ต่างกัน:
| ที่ตั้ง | หน้าที่ | ทบทวนจากบทก่อน |
|---|---|---|
commands/ | slash command ที่นิยามเอง (ไฟล์ .md ต่อ 1 คำสั่ง) | FT-1 |
agents/ | subagent เฉพาะทาง มี system prompt + tools ของตัวเอง | FT-2 |
skills/ | ชุดความรู้/ขั้นตอน (SKILL.md) ที่โหลดมาใช้เมื่อเข้าเงื่อนไข | FT-2 |
hooks/ | สคริปต์รันอัตโนมัติในจังหวะต่างๆ (ก่อน/หลังใช้ tool, จบ session) | ใหม่ |
settings.json | ตั้งค่า permissions, environment variable, การเชื่อมต่อ | ใหม่ |
โปรเจกต์นี้มี .claude/ จริงให้เปิดดูได้เลย — ไปที่
โฟลเดอร์ .claude/ ของโปรเจกต์นี้
จะเห็น commands/ (quiz, lesson, explain, progress) และ agents/ (ai-tutor, quiz-master)
ส่วนเทมเพลตพกพาไปโปรเจกต์อื่นดูได้ที่ TH/ (คู่แปลไทย)
ไฟล์ command มีหน้าตาแบบไหน (frontmatter)
ไฟล์ command/agent/skill ขึ้นต้นด้วย frontmatter
(ข้อมูลกำกับหัวไฟล์ คั่นด้วย ---) แล้วตามด้วยเนื้อหาเป็น Markdown:
---
description: ตั้งคำถามทดสอบความเข้าใจของผู้เรียน
argument-hint: [ระดับ เช่น FT-3]
---
# คำสั่ง /quiz
เมื่อผู้เรียนพิมพ์ /quiz ให้ตั้งคำถาม 3–5 ข้อจากหัวข้อที่ระบุ
ตรวจคำตอบทีละข้อ แล้วให้ feedback เป็นภาษาไทย
MCP เบื้องต้น (Model Context Protocol)
MCP (Model Context Protocol / โพรโทคอลบริบทของโมเดล) คือ มาตรฐานกลาง สำหรับต่อ Claude เข้ากับ เครื่องมือและข้อมูลภายนอก — คิดเหมือน "พอร์ต USB-C ของ AI": เสียบ MCP server เข้าไป Claude ก็ใช้ของนั้นได้ทันที
ตัวอย่างที่ dev เจอบ่อย: MCP server สำหรับ database, GitHub, Jira, ไฟล์ระบบ ฯลฯ
พอเชื่อมแล้ว Claude จะ "อ่านข้อมูลจริง" หรือ "สั่งงานเครื่องมือจริง" ได้ แทนที่จะเดาอย่างเดียว
— คุณเพิ่ม MCP server ด้วยคำสั่ง claude mcp add หรือไฟล์ .mcp.json ที่ root ของโปรเจกต์
สรุปสั้น: skills/commands/agents = ขยายความสามารถจากภายใน ส่วน MCP = ต่อสะพานออกไปหาโลกภายนอก (ข้อมูล/เครื่องมือของจริง) บทนี้ให้รู้จักแนวคิดพอ รายละเอียดลึกจะเจออีกทีตอน Lv3 Tool use และ Lv7 Production
teach-by-example: เปิดของจริงประกอบ
วิธีเรียนเรื่องนี้เร็วที่สุดคือ อ่านของจริง ไม่ใช่ท่องนิยาม โปรเจกต์นี้เตรียมไว้ให้ครบ:
- ../../../CLAUDE.md — CLAUDE.md ตัวจริงที่ทำให้ Claude เป็น "ครู" ในโปรเจกต์นี้
- ../../../.claude/ — commands + agents ของจริง เปิดดูว่า frontmatter + เนื้อหาเขียนยังไง
- ../../../EN/CLAUDE.template.md — เทมเพลตเปล่า เริ่มโปรเจกต์ใหม่ได้ทันที
- ../../../TH/ — คู่แปลไทยของเทมเพลต โครงสร้างเดียวกัน
เริ่มจากเทมเพลตแล้วปรับ — อย่าเขียน CLAUDE.md จากศูนย์
ก็อป EN/CLAUDE.template.md มาเป็นจุดตั้งต้น ลบส่วนที่ไม่ใช้
แล้วเติมของจริงของโปรเจกต์คุณ เร็วกว่าและครบกว่า
- เปิด เทมเพลต แล้วร่าง CLAUDE.md ของโปรเจกต์จริงที่คุณทำอยู่ (NestJS หรือ Go ก็ได้) — ให้มีครบ 5 ส่วน: โปรเจกต์คืออะไร, tech stack, วิธีรัน/เทสต์, conventions, guardrails ระวังข้อ "เป็นจริง" — คำสั่งรัน/เทสต์ต้องตรงกับของจริง
-
เขียน 1 slash command ใน
.claude/commands/ของโปรเจกต์นั้น เช่น/review(รีวิวโค้ดตาม convention) หรือ/newmodule(สร้างโครง NestJS module) — ใส่ frontmatterdescriptionให้เรียบร้อย - บอกมา 1 ตัวอย่างว่า MCP server ตัวไหนจะมีประโยชน์กับงานคุณ และช่วยเรื่องอะไร
ทำเสร็จแล้วพิมพ์ /quiz FT-3 เพื่อทดสอบความเข้าใจ