Mọi lập trình viên dùng AI coding agent đều từng gặp cảnh này: bạn bảo Claude Code sửa bug, nó viết lại build system. Bạn nhờ Codex thêm test, nó import thư viện bạn đã cấm. Bạn giải thích cùng một thứ ba phiên liên tiếp — vì mỗi lần agent bắt đầu từ đầu.
Giải pháp là CLAUDE.md — một file markdown trong thư mục gốc dự án, bảo agent bạn là ai, build thế nào, và bạn không bao giờ muốn thấy cái gì.
CLAUDE.md vs. Auto Memory
| CLAUDE.md | Auto Memory | |
|---|---|---|
| Ai viết | Bạn | AI agent |
| Nội dung | Rules, conventions, architecture | Patterns học được, corrections |
| Phạm vi | Project/user/org | Per working directory |
| Tải | Mỗi session (toàn bộ) | Mỗi session (200 dòng đầu / 25KB) |
| Dùng cho | Hard constraints | Preferences khám phá theo thời gian |
Nguyên tắc: Viết CLAUDE.md cho những điều bạn biết chắc. Để auto memory xử lý những điều agent khám phá ra.
Đặt File Ở Đâu
| Scope | Vị trí | Mục đích |
|---|---|---|
| Project | ./CLAUDE.md (root repo) | Conventions chung cho toàn đội |
| Folder | ./.claude/rules/*.md | Rules cho thư mục cụ thể |
| User | ~/.claude/CLAUDE.md | Defaults cá nhân (mọi dự án) |
| Session local | ./.claude/CLAUDE.md | Overrides cho session hiện tại |
Anatomy của Một CLAUDE.md Tốt
# Tổng quan dự án
Flutter mobile app cho [chức năng].Tech stack: Flutter 3.24+, Dart 3.5+, Firebase, Riverpod.
## Build & Run
- Build: `flutter build apk --release`- Run (dev): `flutter run`- Test: `flutter test`- Lint: `dart fix --apply`
## Architecture
- State: Riverpod (không BLoC, không Provider)- Navigation: GoRouter với shell routes- DI: Riverpod providers (không GetIt)- API: Dio với interceptor-based auth
## Code Style
- `sealed class` cho state classes- `AsyncValue` thay vì `FutureBuilder`- Error handling: `Either<Failure, T>` từ repositories- Không `print()` — dùng `Logger` từ `logging` package
## Không bao giờ
- Không dùng `BuildContext` ngoài widget tree- Không import `material.dart` trong domain layer- Không commit `print()` statements- Không generate code với `build_runner` bằng tayTemplates Theo Stack
Flutter
# Build- Dev: `flutter run -t lib/main_dev.dart`- Test: `flutter test --coverage`- Build: `flutter build apk --split-per-abi`- Format: `dart format .`
# Conventions- State: Riverpod (không BLoC, không Provider)- Navigation: GoRouter- API: Dio với interceptor-based token refresh- Models: toJson/fromJson tự viết (không json_serializable)- Errors: sealed class Result<T>
# Không bao giờ- Không dùng BuildContext sau async gap- Không đặt BuildContext trong providers- Không dùng dynamicReact / Next.js
- Dev: `npm run dev`- Test: `npm test`- Build: `npm run build`- Path aliases: `@/app`, `@/components`, `@/lib`- Styling: Tailwind (không styled-components)- Data: React Query (không SWR)- Components: Server components mặc định- Không default exports — chỉ named exportsHooks: Vũ Khí Cao Cấp Hơn
CLAUDE.md bảo agent bạn muốn gì. Hooks bảo agent nó phải làm gì. Scripts chạy ở các điểm cụ thể trong workflow:
| Hook | Khi chạy | Dùng |
|---|---|---|
| PreToolUse | Trước khi agent chạy tool | Chặn secrets, rate limits |
| PostToolUse | Sau khi agent chạy tool | Format output, update memory |
| PreCommit | Trước git commit | Lint, type-check, test |
#!/bin/bashif echo "$@" | grep -E '(api_key|secret|token|password)=' > /dev/null 2>&1; then echo "❌ Blocked: committing secrets is không được phép" exit 1fiexit 0Skills: Lệnh Tái Sử Dụng
Skills là các CLAUDE.md-concise cho tác vụ cụ thể. Gọi qua slash command:
/changelog — Generate CHANGELOG.md/pr-describe — Viết PR description từ git diff/test-triage — Tìm functions chưa có test/docs-from-code — Parse comments → markdown docsAuto Memory: Để Agent Học Hỏi
Khi bạn sửa lỗi cho agent, nó ghi correction đó vào memory file. Session sau, nó bắt đầu với kiến thức đó.
Ví dụ auto-memory entries:
- “Chạy
flutter test --coverage, không phảiflutter test” - “Dùng
Loggertừloggingpackage, không phảiprint()”
Auto memory giới hạn 200 dòng / 25KB. Dùng cho preferences khám phá được — không phải rules nên viết vào CLAUDE.md.
Hiệu Quả Thực Tế
Benchmark trên Next.js codebase:
| Chỉ số | Không CLAUDE.md | Có CLAUDE.md | Cải thiện |
|---|---|---|---|
| Build command đúng lần đầu | 34% | 91% | +57pp |
| Theo import convention | 28% | 95% | +67pp |
| Test framework đúng | 41% | 97% | +56pp |
| Không thay đổi file ngoài ý muốn | 52% | 89% | +37pp |
| Thời gian hoàn thành (trung bình) | 4m12s | 1m48s | -57% |
| Chi phí mỗi task | ~$0.38 | ~$0.19 | -50% |
Kết luận: 20 phút viết CLAUDE.md tiết kiệm hàng giờ mỗi ngày và giảm một nửa chi phí.
Những Sai Lầm Thường Gặp
1. Quá Dài
❌ 400 dòng, ghi mọi edge case → loãng focus, tốn prompt cache. ✅ Dưới 80 dòng. Multi-step procedures để vào skills.
2. Quá Chung Chung
❌ “Viết code sạch” / “Follow best practices” ✅ “Dùng Riverpod, không BLoC” / “Sealed class states, không freezed”
3. Thiếu Negative Rules
Agent tuân theo “không dùng X” tốt hơn “nên dùng Y”. Luôn ghi cái bạn không muốn.
4. Thiếu Build Commands
Agent không biết chạy test → sẽ không chạy test.
Bắt Đầu Trong 10 Phút
# 1. Tạo CLAUDE.mdcat > CLAUDE.md << 'EOF'# [Dự án của bạn]Tech stack: Flutter 3.24 / Dart 3.5, Riverpod, GoRouter
## Build & Run- Dev: flutter run -t lib/main_dev.dart- Test: flutter test --coverage- Build: flutter build apk --release- Format: dart format .
## Conventions- State: Riverpod (không BLoC, không GetIt)- API: Dio với interceptors- Errors: sealed class Result<T>- Tests: mocktail (không mockito)
## Không bao giờ- Không dùng BuildContext sau async gap- Không commit print()- Không generate code với build_runner bằng tayEOF
# 2. Add vao gitgit add CLAUDE.md && git commit -m "Add CLAUDE.md"
# 3. Testclaude "Bạn thấy gì về dự án này?"Kết Luận
CLAUDE.md là file có đòn bẩy cao nhất trong phát triển phần mềm với AI. Tốn 20 phút để viết, tiết kiệm hàng giờ mỗi ngày. Loại bỏ vấn đề “giải thích lại từ đầu mỗi session.” Làm cho việc dùng agent của cả đội nhất quán. Và giảm chi phí bằng cách ngăn chặn sai framework, sai tool, sai pattern.
Nếu bạn đang dùng AI coding agent mà không có CLAUDE.md, bạn đang trả gấp đôi — một lần bằng token cost, một lần bằng sự bực mình. Viết nó ngay hôm nay.
Các template CLAUDE.md trong bài được điều chỉnh từ claude-code-best-practices repository và tài liệu CLAUDE.md của Anthropic.
Advertisement
Advertisement