Bài 5 · Vận dụng · 20 phút· Cập nhật 11/06/2026
CLAUDE.md & bộ nhớ dự án
Biên soạn bởi Nguyễn Anh Tuấn
Ghi quy ước để AI bám đúng: CLAUDE.md (dự án/cá nhân), phím tắt #, /memory, import @, /init và bộ nhớ tự động.
Bạn không muốn mỗi phiên lại phải nhắc “dự án này dùng pnpm”, “test bằng Vitest”, “đừng sửa thư mục legacy”. CLAUDE.md là một file Claude tự đọc khi mở phiên - nơi bạn ghi quy ước một lần để nó bám đúng mãi.
- ▸CLAUDE.md = trí nhớ dài hạn do BẠN viết cho dự án; Claude đọc tự động mỗi phiên.
- ▸Chứa: lệnh build/test, quy ước, cấu trúc, “luật” cần tuân thủ.
- ▸Được nạp lại sau khi ngữ cảnh bị nén (compact) - quy ước cốt lõi không bị quên giữa chừng.
Đỡ lặp lại = bớt sai
Có nhiều tầng CLAUDE.md, gộp với nhau (tầng ngoài rộng, tầng trong cụ thể). Từ rộng đến hẹp:
Tổ chức (managed policy)
Chính sách do công ty đặt - áp cho mọi người (nếu có).
~/.claude/CLAUDE.md - cá nhân
Sở thích của bạn, áp cho MỌI dự án trên máy.
./CLAUDE.md - dự án (commit, chia sẻ cả nhóm)
Quy ước & lệnh của dự án này - quan trọng nhất.
./CLAUDE.local.md - cục bộ (KHÔNG commit)
Ghi chú riêng bạn trong dự án này; để trong .gitignore.
- ▸Quy ước CẢ NHÓM → ./CLAUDE.md và commit vào git.
- ▸Sở thích RIÊNG → ~/.claude/CLAUDE.md (mọi dự án) hoặc CLAUDE.local.md (dự án này).
- ▸Gõ /init để Claude sinh CLAUDE.md ban đầu từ chính code của bạn.
Thử bật/tắt từng tầng để thấy tầng nào thắng khi có xung đột quy ước:
Xung đột quy ước: Thụt lề (indentation) - mỗi tầng khai báo một giá trị khác nhau. Bật/tắt từng tầng để xem tầng nào thắng và vì sao:
Kết quả (2 tầng đang nạp)
Tầng cụ thể nhất (nạp cuối) có khai báo quy ước → thắng. Tầng còn lại (kể cả rộng hơn) đều bị ghi đè.
Bí quyết: ngắn, cụ thể, hành động được. Dưới đây là một ví dụ gọn cho dự án web:
CLAUDE.md
# Dự án: Cửa hàng X (web)
## Lệnh
- Cài: pnpm install
- Chạy dev: pnpm dev
- Test: pnpm test (LUÔN chạy trước khi commit)
- Build: pnpm build
## Quy ước
- TypeScript; thụt lề 2 dấu cách; dùng nháy đơn.
- Component đặt trong src/lib/components, đặt tên PascalCase.
- Không sửa thư mục legacy/ (mã cũ, chỉ tham khảo).
## Quy trình
- Làm trên nhánh; mở PR vào main; không commit thẳng main. - ▸“Dùng thụt lề 2 dấu cách” thắng “format cho đẹp” - cụ thể luôn tốt hơn chung chung.
- ▸Ưu tiên: lệnh build/test, quy ước, cấu trúc, vài luật hay bị phá.
- ▸Giữ ngắn (thường < ~200 dòng): dài quá làm loãng ngữ cảnh, Claude bám kém.
Khi nào KHÔNG nên nhồi vào CLAUDE.md
Không cần mở file thủ công. Đang làm mà nghĩ ra một quy ước, gõ một dòng bắt đầu bằng # - Claude lưu vào bộ nhớ ngay:
› # Luôn chạy `pnpm test` trước khi commit
Đã thêm vào CLAUDE.md của dự án. Tôi sẽ nhớ ở phiên này và các phiên sau.
› /memory
Đang nạp: ./CLAUDE.md (dự án - commit) ~/.claude/CLAUDE.md (cá nhân) bộ nhớ tự động: MEMORY.md
- ▸# <ghi chú> - thêm nhanh một điều cần nhớ vào CLAUDE.md (Claude hỏi lưu ở tầng nào).
- ▸/memory - mở danh sách file nhớ đang nạp để xem & sửa trực tiếp.
- ▸@đường-dẫn trong CLAUDE.md - gộp nội dung file khác vào (vd @docs/quy-uoc.md).
Dạy Claude ngay lúc nó sai
Ngoài CLAUDE.md (do bạn viết), Claude Code còn có bộ nhớ tự động: nó tự ghi lại những điều học được qua các phiên - quyết định dự án, mẹo gỡ lỗi, thứ bạn từng chỉnh. Lần sau quay lại, nó “nhớ” mà không cần bạn nhắc.
- ▸CLAUDE.md = BẠN viết (chỉ dẫn). Bộ nhớ tự động = CLAUDE viết (ghi chú cho chính nó).
- ▸Lưu cục bộ trên máy bạn, là markdown thường - xem/sửa/xoá tuỳ ý (qua /memory).
- ▸Bật/tắt được; nếu thấy nó nhớ điều không nên, cứ mở file ra sửa hoặc xoá.
Tổng kết
Câu hỏi thường gặp
Là một file markdown Claude TỰ ĐỌC mỗi khi bắt đầu phiên trong dự án. Nó chứa quy ước, lệnh build/test, cấu trúc, những điều bạn muốn Claude luôn nhớ. Nhờ vậy bạn khỏi lặp lại “dự án này dùng pnpm”, “test bằng vitest”… mỗi lần. Nó cũng được nạp lại sau khi ngữ cảnh bị nén (compact), nên các quy ước cốt lõi không bị quên giữa chừng.
Cấp DỰ ÁN ./CLAUDE.md (chia sẻ cả nhóm - NÊN commit). Cấp CÁ NHÂN ~/.claude/CLAUDE.md (áp cho mọi dự án của riêng bạn). Cấp CỤC BỘ CLAUDE.local.md (riêng bạn trong dự án này - KHÔNG commit, để trong .gitignore). Tổ chức có thể đặt thêm chính sách cấp cao. Các tầng GỘP lại với nhau.
Gõ /init trong dự án - Claude khảo sát code và sinh một CLAUDE.md ban đầu (ngôn ngữ, lệnh build/test, cấu trúc). Sau đó bạn tỉa lại cho đúng. Không cần viết từ con số 0.
Càng ngắn-gọn-cụ thể càng tốt (thường dưới ~200 dòng). File quá dài làm loãng ngữ cảnh và Claude bám kém hơn. Ưu tiên: lệnh build/test, quy ước đặt tên, cấu trúc thư mục, và những “luật” bạn thấy Claude hay phá. Viết “dùng thụt lề 2 dấu cách” thắng “format code cho đẹp”.
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
CLAUDE.md là gì theo bài học?
- 1
Khởi tạo bằng /init
Trong một dự án thật, chạy
/initvà để Claude sinhCLAUDE.md. Đọc kết quả: nó nắm đúng lệnh build/test chưa?Hoàn thành khi: Có file
CLAUDE.mdở gốc dự án; bạn kiểm và sửa cho khớp thực tế (vd đổi npm → pnpm nếu cần). - 2
Tỉa cho gọn
Rút gọn
CLAUDE.mdxuống còn những điều CỐT LÕI: lệnh build/test, quy ước đặt tên, cấu trúc, 1-2 luật quan trọng.Hoàn thành khi: File ngắn, mỗi dòng cụ thể & hành động được; bỏ những câu chung chung vô thưởng vô phạt.
- 3
Ghi nhớ bằng #
Đang trong phiên, gõ một dòng bắt đầu bằng
#để dạy Claude một quy ước (vd “# luôn dùng dấu nháy đơn trong JS”).Hoàn thành khi: Claude xác nhận đã lưu; mở
CLAUDE.mdthấy dòng vừa thêm. - 4
Tầng nào commit?
Bằng lời: một quy ước CHO CẢ NHÓM nên đặt ở file nào? Còn sở thích RIÊNG bạn (vd editor) nên ở đâu?
Hoàn thành khi: Quy ước nhóm →
./CLAUDE.md(commit). Sở thích riêng →CLAUDE.local.md(gitignore) hoặc~/.claude/CLAUDE.md. - 5
Xem bộ nhớ
Gõ
/memoryđể xem các file nhớ đang được nạp. CóCLAUDE.mdcấp nào? Có bộ nhớ tự động không?Hoàn thành khi: Bạn liệt kê được các file đang ảnh hưởng tới phiên và phân biệt cái nào do bạn viết, cái nào Claude tự ghi.