Path-specific rules: paths glob ใน .claude/rules/
แนวคิด
ไฟล์ใน .claude/rules/ ใส่ YAML frontmatter ที่มี field paths เป็นชุด glob pattern ได้ เมื่อใส่ paths rule นั้นจะกลายเป็น conditional คือโหลดเข้า context เฉพาะตอนที่ Claude ทำงานกับไฟล์ที่ตรง pattern เท่านั้น ส่วน rule ที่ไม่มี paths จะโหลดแบบไม่มีเงื่อนไข ใช้กับทุกไฟล์
glob pattern ใช้แบบเดียวกับ gitignore เช่น **/*.ts แมตช์ไฟล์ TypeScript ทุกโฟลเดอร์, src/**/* แมตช์ทุกไฟล์ใต้ src/, *.md แมตช์เฉพาะ markdown ที่ราก project และยังใช้ brace expansion รวมหลายนามสกุลได้ เช่น src/**/*.{ts,tsx} เขียนหลาย pattern ในไฟล์เดียวก็ได้ นอกจากนี้ยังมี user-level rule ที่ ~/.claude/rules/ สำหรับความชอบส่วนตัวข้ามทุก project
ประโยชน์หลักคือกฎโหลดเมื่อเกี่ยวเท่านั้น ลด context ที่ไม่จำเป็นและประหยัด token ซึ่งเป็นข้อได้เปรียบเหนือการยัดทุกอย่างไว้ใน CLAUDE.md ก้อนเดียว
ทำไมสำคัญ
โจทย์ที่ exam guide ยกคือ codebase มีหลายพื้นที่ที่ convention ต่างกัน React component ใช้ functional style กับ hooks, API handler ใช้ async/await กับ error handling เฉพาะ, database model ใช้ repository pattern และที่ยากคือไฟล์เทสต์กระจายอยู่ทั่ว codebase ข้างไฟล์ที่มันเทสต์ เช่น Button.test.tsx วางข้าง Button.tsx เราอยากให้เทสต์ทุกไฟล์ตาม convention เดียวกันไม่ว่าอยู่โฟลเดอร์ไหน
ทางเลือกที่ดีที่สุดคือสร้างไฟล์ใน .claude/rules/ ที่มี glob เช่น paths: ["**/*.test.tsx"] เพราะ glob จับไฟล์ตามชนิดได้ข้ามทุกโฟลเดอร์ นี่คือจุดที่ path-specific rule ชนะ subdirectory CLAUDE.md เพราะ CLAUDE.md ผูกกับไดเรกทอรี มันดูแลไฟล์ที่กระจัดกระจายข้ามหลายโฟลเดอร์ไม่ได้ง่าย ต้องไปวางไฟล์ในทุกโฟลเดอร์ที่มีเทสต์ ส่วนการรวมทุก convention ไว้ใน root CLAUDE.md แล้วหวังให้ Claude เดาเองว่า section ไหนใช้ ก็พึ่ง inference ที่ไม่แน่นอน และการใช้ skill ก็ต้องพึ่งการ invoke หรือการที่ Claude เลือกโหลด ไม่ใช่การ apply อัตโนมัติตาม path
ตัวอย่าง
---
paths:
- "**/*.test.tsx"
- "**/*.test.ts"
---
# Testing conventions
- ใช้ Testing Library ไม่ใช้ enzyme
- หนึ่ง describe ต่อหนึ่ง component
- ห้าม mock สิ่งที่เทสต์ integration ได้จริง
กฎนี้โหลดเฉพาะตอน Claude แตะไฟล์เทสต์ ไม่ว่าไฟล์นั้นจะซ่อนอยู่ลึกแค่ไหน ลองปรับ path ในตัวจำลองด้านล่างเพื่อดูว่ากฎใดจะ apply
**/*.test.tsx— ไฟล์เทสต์components/sims/*.tsx— คอมโพเนนต์ simlib/**/*.ts— ตัวช่วยใน libcontent/**— เนื้อหาบทเรียนrule ที่ใช้กับ path นี้: ไฟล์เทสต์, คอมโพเนนต์ sim
ลำดับชั้น CLAUDE.md (ตัวใกล้สุดชนะ และทุกระดับมีผลสะสมกัน)
| ระดับ | ที่อยู่ไฟล์ | ขอบเขต |
|---|---|---|
| User | ~/.claude/CLAUDE.md | มีผลกับทุกโปรเจกต์บนเครื่องนี้ |
| Project | ./CLAUDE.md (repo root) หรือ ./.claude/CLAUDE.md | มีผลกับทุกอย่างใน repo นี้ |
| Directory | some/subdir/CLAUDE.md | มีผลเฉพาะไดเรกทอรีนั้นและที่อยู่ข้างใต้เท่านั้น |
เช็คความเข้าใจ
ทำไม .claude/rules/ กับ glob เหมาะกับไฟล์เทสต์ที่กระจายทั่ว codebase มากกว่า subdirectory CLAUDE.md
rule ใน .claude/rules/ ที่มี paths frontmatter โหลดเมื่อใด