Tự nhận luật theo vị trí
Mở ở thư mục nào, Claude tự đọc đúng luật chỗ đó cộng luật chung — bạn không phải dặn lại mỗi lần.
Bộ thiết lập Claude Code · Biên soạn bởi Eroca Thanh
Hầu hết mọi người dừng ở một file CLAUDE.md rồi nghĩ vậy là đủ — trong khi thư mục .claude vẫn để trống. Nửa đầu là sơ đồ đầy đủ từng thư mục (kèm khối bấm sao chép là dùng ngay); nửa sau là cách Thanh đẩy nó lên cả một hệ nhiều agent chạy thật mỗi ngày.
Khoảng trống tạo khác biệt
Hầu hết mọi người cài Claude Code, viết một file CLAUDE.md rồi nghĩ vậy là đủ. Trong khi đó thư mục .claude vẫn để trống: không agents, không skills, không hooks để làm giúp bạn những việc lặp đi lặp lại. Chính khoảng trống đó tạo ra toàn bộ sự khác biệt.
Hãy hình dung một dự án Claude Code như một văn phòng. CLAUDE.md là tờ nội quy dán ở cửa — ai vào cũng đọc. Còn .claude là cả bộ máy phía sau: nhân sự chuyên trách (agents), kỹ năng đóng gói (skills), nút bấm tự động (hooks), lệnh tắt (commands).
Khi bộ máy đó trống, Claude chỉ trả lời câu hỏi. Khi bạn lấp đầy nó, Claude bắt đầu làm việc thay bạn — đúng cách bạn muốn, lặp lại được, không phải dặn lại mỗi lần.
Đây là bản đồ bạn sẽ dựng xong sau trang này. Mỗi dòng đều có một mục riêng bên dưới, kèm khối cấu hình bấm sao chép là dùng được.
dự-án-của-bạn/
├── CLAUDE.md # nội quy Claude đọc đầu mỗi phiên
├── CLAUDE.local.md # ghi chú riêng của bạn — không đẩy lên git
├── .gitignore # giấu file "local" và thông tin bí mật
└── .claude/ # toàn bộ cấu hình — nơi tạo khác biệt
├── agents/ # trợ lý theo việc (Eroca dùng cách mạnh hơn ↓)
├── skills/ # kỹ năng đóng gói thành quy trình
├── commands/ # lệnh tắt gõ "/" là chạy
├── hooks/ # tự động chạy trước/sau mỗi bước
├── output-styles/ # định dạng câu trả lời theo ý bạn
├── plugins/ # cài thêm nguồn và kết nối dữ liệu (MCP)
├── rules/ # (tuỳ chọn) gom quy tắc tách riêng
└── scripts/ # script phụ trợ cho skills
Ba file gốc
Trước khi vào .claude, có ba file nằm ngay thư mục dự án. Đây là nền móng — làm đúng ba file này, Claude đã hiểu dự án của bạn hơn hẳn phần lớn người dùng.
File quan trọng nhất. Claude đọc nó đầu mỗi phiên để biết dự án của bạn là gì, viết bằng gì, quy ước ra sao. Hãy coi nó như buổi bàn giao việc cho người mới.
# Dự án: [tên dự án của bạn]
## Bối cảnh
Mô tả ngắn dự án làm gì, cho ai.
## Công nghệ
- Ngôn ngữ và thư viện chính
- Cách chạy thử, cách build
## Quy ước
- Giọng văn, cách đặt tên, thư mục nào để làm gì
- Việc luôn làm / việc luôn tránh
## Lệnh hay dùng
- Chạy thử: ...
- Kiểm thử: ...
Đây là cách chuẩn của Claude Code để ghi chú riêng không đẩy lên git. Hợp cho người mới. Nhưng nếu bạn muốn Claude nhớ lâu dài qua nhiều phiên, có cách mạnh hơn một file tĩnh — Thanh dùng một hệ bộ nhớ tự lớn (xem mục "Bộ nhớ & vòng đời" ở cuối trang).
# Ghi chú riêng (không chia sẻ)
- Đường dẫn trên máy mình: ...
- Việc đang làm dở: ...
- Nhắc riêng cho Claude khi làm với mình: ...
Dặn git bỏ qua những file không nên chia sẻ: ghi chú cá nhân, cấu hình máy, và mọi thông tin bí mật như khoá API hay mật khẩu. Đây là tuyến phòng thủ để bạn không lỡ tay đẩy bí mật lên mạng.
# Ghi chú và cấu hình cá nhân
CLAUDE.local.md
.claude/settings.local.json
# Thông tin bí mật — TUYỆT ĐỐI không đẩy lên
.env
.env.*
*.key
*.pem
Hai thư mục tạo sức mạnh
Nếu chỉ thêm được hai thứ vào .claude, hãy thêm hai thư mục này. Chúng biến Claude từ "người trả lời" thành "người làm được việc chuyên môn, lặp lại theo đúng cách của bạn".
Cách chuẩn của Claude Code: mỗi agent là một file .md trong .claude/agents/ mô tả một trợ lý có vai riêng (ví dụ một trợ lý chuyên soát lỗi) và những công cụ nó được dùng.
---
name: code-review
description: Soát lỗi và góp ý chất lượng cho đoạn mã vừa thay đổi.
tools: Read, Grep, Bash
---
Bạn là người soát mã kỹ tính. Khi được gọi:
1. Đọc phần vừa thay đổi.
2. Chỉ ra lỗi đúng/sai, rủi ro bảo mật, chỗ khó đọc.
3. Góp ý ngắn gọn, ưu tiên việc quan trọng trước.
Skill là một việc bạn làm đi làm lại, gói lại một lần để dùng mãi. Mỗi skill là một thư mục con chứa file SKILL.md; Claude tự đọc phần mô tả để biết khi nào nên dùng. Đây là thứ Thanh dùng nhiều nhất — hiện có gần 70 skill thật trong máy (đăng bài, xuất PDF, chấm bài, cập nhật trạng thái, giao việc cho agent khác...).
Một SKILL.md thật trông như thế này (rút gọn từ skill cập nhật trạng thái):
---
name: status-update
description: Cập nhật bảng việc bằng cách đối chiếu hội thoại
gần đây rồi đề xuất thay đổi — luôn cần xác nhận trước khi sửa.
---
# status-update — quy trình 6 bước
## Bước 1 — Đọc trạng thái hiện tại
## Bước 2 — Đối chiếu hội thoại, nhận ra việc mới / việc đã xong
## Bước 3 — Đề xuất thay đổi cho người dùng xem
## Bước 4 — Khoá file trước khi ghi (tránh hai phiên cùng sửa)
## Bước 5 — Ghi thay đổi + đóng dấu thời gian
## Bước 6 — Đồng bộ lên trang trạng thái
Tự động hoá việc lặp
Hai thư mục này lo phần "đỡ tay" cho bạn: gõ một lệnh ngắn thay cho cả đoạn dài, và để máy tự chạy việc nền mà không cần nhắc.
Cách chuẩn của Claude Code: mỗi file .md trong .claude/commands/ là một lệnh tắt, gõ /tên-lệnh là chạy. Ví dụ một lệnh tạo commit:
Xem các thay đổi đang có (git diff), rồi:
1. Tóm tắt thay đổi thành một câu ngắn, rõ.
2. Tạo commit với câu đó theo đúng quy ước dự án.
3. Báo lại cho tôi nội dung commit vừa tạo.
Hook là việc chạy tự động tại một thời điểm: khi mở phiên (SessionStart), hay sau mỗi lần Claude dùng công cụ (PostToolUse). Bạn khai báo hook trong file cấu hình:
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "python3 \"$HOME/.claude/hooks/nhac-viec.py\""
}
]
}
]
}
}
Hook của Thanh không phải để định dạng mã, mà để quản trị khi có nhiều agent cùng làm — viết bằng Python. Ví dụ một hook cảnh báo khi bảng việc phình quá to:
#!/usr/bin/env python3
# nhac-viec.py — chạy khi mở phiên: cảnh báo nếu bảng việc phình to.
# Nguyên tắc 1: hook chỉ NHẮC (đếm + báo), không tự sửa — việc sửa để cho mình quyết.
# Nguyên tắc 2: HỎNG-LÀ-IM (fail-open) — mọi lỗi đều thoát êm (exit 0), KHÔNG chặn phiên.
import sys, os
try:
f = os.path.expanduser("~/Operations/STATE.md")
if os.path.getsize(f) > 150_000:
print("Bảng việc đang to — cân nhắc dọn bớt mục đã xong.")
except Exception:
pass # hỏng thì im, không bao giờ chặn phiên làm việc
sys.exit(0)
Mở rộng và tuỳ biến
Hai thư mục này giúp Claude với tới dữ liệu bên ngoài và trả lời theo đúng phong cách bạn muốn.
MCP là cách Claude nối tới công cụ và dữ liệu bên ngoài: kho tệp, lịch, cơ sở dữ liệu, dịch vụ bạn đang dùng. Ở máy Thanh hiện có khoảng 19 nguồn MCP thật đang chạy — Drive, Gmail, Lịch, Notion, Supabase, Vercel, WordPress, quảng cáo Facebook, dựng ảnh, dựng video... Có hai cách nối, và đa số người mới hay nhầm:
1) Nối từ xa (remote connector) — qua claude.ai
→ Bật trong phần kết nối của tài khoản, KHÔNG cần file .mcp.json.
→ Hợp với dịch vụ có sẵn cổng (Drive, Notion, Vercel...).
2) Nối tại máy (stdio local) — khai báo trong .mcp.json
→ Claude chạy một lệnh trên máy bạn để mở nguồn dữ liệu.
Khai báo một nguồn chạy tại máy trong .mcp.json:
{
"mcpServers": {
"ten-nguon": {
"command": "npx",
"args": ["-y", "ten-goi-mcp"]
}
}
}
Còn chợ plugin chính thức thì thêm bằng lệnh (tên kho cho đúng):
/plugin marketplace add anthropics/claude-plugins-official
/plugin install ten-plugin
Đây là cách chuẩn của Claude Code để đổi phong cách trả lời (ví dụ ngắn gọn cho điện thoại) — mỗi style là một file mô tả. Bạn có thể thêm sau nếu cần.
Thanh thì không dùng output-styles — giọng và phong cách trả lời được điều khiển ngay trong CLAUDE.md (quy ước xưng hô, giọng văn, việc tránh) cộng với hệ bộ nhớ và skills. Cách đó áp được cho mọi phiên, mọi dự án, chứ không chỉ một preset.
Quyền hạn và phụ trợ
Hai thư mục cuối lo phần "luật chơi" và "tay chân": Claude được phép làm gì, và những đoạn việc kỹ thuật bạn muốn gọi lại cho nhanh.
Phần cấu hình quan trọng nhất là hai file settings, nằm thẳng ở .claude/ gốc: settings.json (chia sẻ cho nhóm) và settings.local.json (riêng máy bạn). Thư mục rules/ chỉ là chỗ tuỳ chọn để tách bớt khi quy tắc dài ra — không bắt buộc.
Trong settings, bạn đặt quyền: việc gì Claude tự làm, việc gì phải hỏi trước.
{
"permissions": {
"allow": ["Bash(npm run test)", "Read", "Edit"],
"ask": ["Bash(git push:*)"]
}
}
Với cấu hình này, Claude được tự chạy kiểm thử và sửa file, nhưng phải hỏi bạn trước khi đẩy mã lên.
Khi có việc kỹ thuật lặp lại — xuất dữ liệu, dọn dẹp, đồng bộ — bạn tách thành script riêng rồi gọi lại khi cần. Script thật của Thanh lo phần tự động hoá bảng việc, ví dụ:
archive-done.py # lưu việc đã xong vào nhật ký vĩnh viễn
reconcile-done.py # đối chiếu cho khớp TRƯỚC khi dọn bảng việc
sync-state.py # đồng bộ trạng thái lên trang web lịch
Một nguyên tắc Thanh giữ: luôn lưu trước khi dọn — archive-done.py chép việc đã xong sang nhật ký, reconcile-done.py kiểm cho khớp, rồi mới được xoá khỏi bảng. Không bao giờ xoá thẳng.
Bắt tay vào làm
Không cần làm hết một lúc. Đây là thứ tự Thanh khuyên: mỗi bước đều dùng được ngay, và bạn thêm dần khi gặp việc lặp lại.
Bàn giao dự án cho Claude: làm gì, viết bằng gì, quy ước ra sao. Đây là bước đổi đời lớn nhất.
Tách ghi chú riêng và giấu bí mật trước khi làm gì thêm.
Chọn đúng việc bạn làm nhiều nhất, gói thành skill. Lần sau chỉ việc gọi.
Một trợ lý chuyên trách (soát lỗi, tìm tài liệu) cho việc cần góc nhìn riêng.
Cho phép việc an toàn, bắt hỏi trước với việc nhạy cảm như đẩy mã.
Khi thấy mình lặp một thao tác, biến nó thành hook hoặc lệnh /.
Chạy đoạn này ngay ở thư mục dự án để tạo sẵn khung .claude/:
mkdir -p .claude/{agents,skills,commands,hooks,output-styles,plugins,scripts}
touch CLAUDE.md CLAUDE.local.md .gitignore
echo "CLAUDE.local.md" >> .gitignore
echo ".claude/settings.local.json" >> .gitignore
echo ".env" >> .gitignore
echo "Đã tạo xong khung .claude/ — giờ điền CLAUDE.md trước nhé."
Khi một .claude/ là chưa đủ
Dựng xong .claude cho một dự án, bạn đã đi trước phần lớn người dùng. Nhưng khi bạn có nhiều dự án cùng lúc, và muốn nhiều trợ lý làm việc song song mà không giẫm chân nhau — một .claude là chưa đủ. Đây là cách Thanh đang làm thật mỗi ngày.
Ý tưởng gốc: thay vì một file agent trong một dự án, Thanh coi mỗi phiên làm việc là một agent có tên, có vai, có quyền riêng — ví dụ claude-lich-deploy (chỉ lo đẩy trang lịch lên mạng), claude-email-funnel-pm (điều phối phễu email). Hiện có 22 vai có "hồ sơ nhập vai" đầy đủ — và đó mới là phần lõi: cả đội còn lớn hơn (hàng chục vai đang hoạt động), tất cả theo dõi trên một bảng việc chung mà bạn xem được công khai (mục dưới).
Tất cả sống ở thư mục ~/Operations/agents/ — ngoài .claude của từng dự án, ở tầng cả máy:
~/Operations/agents/
├── CLAUDE-LICH-DEPLOY-BOOT.md # "hồ sơ nhập vai" của 1 agent
├── CLAUDE-EMAIL-PM-BOOT.md # ... (22 hồ sơ, mỗi agent 1 file)
├── ACTIVE.md # sổ đăng ký: ai đang làm, sở hữu việc gì
├── ACTIVE-archive.md # agent đã nghỉ / về hưu
├── AUTHORITY-MATRIX.md # ai được phép làm gì
└── PM-TASK-ASSIGNMENTS.json # ai đang được giao việc gì
Mỗi agent khởi động bằng cách đọc hồ sơ nhập vai của nó — một file ghi rõ "em là ai, đọc gì trước, được làm gì". Mở phiên mới, đặt tên, dán một câu là agent tự vào vai:
Em là `claude-lich-deploy` — agent chuyên đẩy trang lịch lên mạng.
Đọc theo thứ tự rồi báo cáo tình hình:
1. Hồ sơ vai + quy tắc riêng
2. Quy trình deploy (skill /deploy-lich)
3. Bảng việc hiện tại + sổ đăng ký (kiểm xem mình đã có dòng chưa)
Xong thì chờ tôi ra lệnh — KHÔNG tự deploy.
Để nhiều agent không giẫm chân nhau
Nhiều trợ lý cùng chạy thì câu hỏi khó nhất là: làm sao chúng không sửa đè lên nhau, không làm trùng việc, không gây loạn? Thanh giải bằng ba cơ chế — và đây là phần gần như không ai dạy.
Tất cả việc của mọi dự án nằm trong một bảng duy nhất — ~/Operations/STATE.md — sắp theo bốn ô ưu tiên (làm ngay / chiến lược / chờ / chưa rõ). Mỗi việc ghi rõ ai sở hữu; một agent không được sửa việc của agent khác.
### [đẩy-trang-lich] Đồng bộ trạng thái lên web lịch
- owned_by: claude-lich-deploy # ai sở hữu việc này
- status: in_progress
- since: 2026-06-15
- next_action: chờ tôi duyệt rồi đẩy bản mới
Khi một agent điều phối (PM) giao việc cho agent khác, hai bên nói chuyện qua một file kênh chỉ ghi thêm, không xoá (PM-CHANNEL) — giao việc, hỏi đáp, báo xong đều để lại dấu. Chính trang bạn đang đọc cũng được giao và duyệt qua một kênh như vậy.
### [10:00] PM → agent thực thi
🎯 Giao việc: dựng trang, xong báo REVIEW trước khi đưa lên mạng.
### [10:40] agent thực thi → PM
📋 REVIEW: đã dựng + kiểm thử xong, chờ duyệt. (kèm đường dẫn)
### [10:45] PM → agent thực thi
✅ DUYỆT — đưa lên được.
Với vài file dùng chung (như bảng việc), trước khi ghi agent phải giành khoá trong 120 giây, và ngay trước khi ghi còn kiểm lại lần cuối "có ai vừa sửa không" — nếu có thì đọc lại rồi đề xuất lại. Nhờ vậy hai agent không bao giờ ghi đè mất việc của nhau.
Lý thuyết là vậy. Còn đây là lúc cả ba cơ chế trên cùng chạy trên một việc thật — một đợt gửi thư. Không phải một agent "cứ thế gửi", mà bốn vai chuyền việc cho nhau, có người gác cổng ở hai đầu.
Ảnh thật: một dây chuyền chạy trọn một đợt gửi thư — bốn vai chuyền việc, hai cổng gác.
Đọc theo chiều chuyền việc: Thanh gác cổng đầu (duyệt hướng) → pm-166 (quản đốc) chẻ hướng thành các bức thư + xếp lịch → email-funnel-pm-r2 (trưởng phễu) chỉ việc xuống → crm-mvp (chạy danh sách) kéo đúng tệp khách, đặt lịch cả loạt.
Hai cái cổng làm nên độ an toàn. Cổng tuân thủ: crm-mvp tự dán nhãn "đã áp luật bảo vệ dữ liệu cá nhân (PDPL)" GIỮA chuyền, trước khi gửi. Cổng nghiệm thu: pm-166 soi lại nội dung + tệp NGAY TRƯỚC nút bắn — cái nút bấm là cả nghìn người nhận, không lấy lại được.
Ảnh thật bảng điều phối — chụp 15/6; xem cập nhật thời gian thực tại lich.erocathanh.com
CLAUDE.md không chỉ là một file
Ở phần đầu, CLAUDE.md là một file cho một dự án. Khi cả máy có hàng chục dự án, Thanh đặt CLAUDE.md ở nhiều tầng — và chúng tự xếp chồng lên nhau theo vị trí bạn đang làm việc. Đây là "hiến pháp" của cả cỗ máy.
Ba tầng, từ chung đến riêng:
~/
├── CLAUDE.md # TẦNG GỐC — nội quy chung, MỌI phiên đều đọc
│ # (cách xưng hô, bố cục thư mục, vòng đời, luật cứng)
├── idea/inbox/ # nháp → chỉ gốc + per-project (không cần luật miền)
│ └── /CLAUDE.md
├── Development/ # đang build → chỉ gốc + per-project
│ └── /CLAUDE.md
├── Projects/ # repo chính
│ ├── CLAUDE.md # TẦNG MIỀN — brand, giọng, bản đồ repo
│ └── /CLAUDE.md # TẦNG DỰ ÁN — stack, quy ước riêng repo
├── Operations/ # vận hành
│ └── CLAUDE.md # TẦNG MIỀN — luật bảng việc / khoá / sổ đăng ký
└── Documents/EROCA_WIKI/ # kho tri thức
└── CLAUDE.md # TẦNG MIỀN — luật kho tri thức
Cách nối: Claude tự đọc CLAUDE.md ở thư mục bạn đang đứng, rồi lần ngược lên tận thư mục nhà. Mở phiên ở một repo trong Projects, Claude nhận chồng ba lớp: luật repo + luật miền Projects + nội quy gốc. Ở thư mục nháp thì chỉ hai lớp (dự án + gốc). Mục "trỏ đường" cuối mỗi file dẫn tiếp xuống chi tiết — thành một mạng có điều hướng, không rời rạc.
Điểm tinh ý: không phải tầng nào cũng cần file luật miền. Chỉ ba nơi thật sự có luật riêng mới đặt (Projects, Operations, kho tri thức); tầng nháp thì gốc lo là đủ. Ở máy Thanh: 1 file gốc + 3 file tầng miền + 21 file cấp dự án — đặt đúng chỗ cần, không thừa.
Mở ở thư mục nào, Claude tự đọc đúng luật chỗ đó cộng luật chung — bạn không phải dặn lại mỗi lần.
Luật chung ở gốc, luật miền ở tầng miền, luật riêng ở dự án — không trùng lặp, không lệch nhau theo thời gian.
Mỗi phiên chỉ nạp lớp liên quan tới vị trí, phần chi tiết để lại "trỏ đường" gọi khi cần — không nuốt một file nặng.
Dự án mới = thêm một CLAUDE.md của nó; nó tự thừa kế luật gốc + luật miền, khỏi chép lại.
Gốc trỏ xuống tầng miền và bộ nhớ; agent luôn biết tìm luật "chính chủ" ở đâu, không đoán.
Bộ nhớ tự lớn & vòng đời dự án
Hai mảnh cuối của hệ: một bộ nhớ tự lớn theo thời gian (thay cho một file ghi chú phẳng), và một vòng đời rõ ràng để dự án không trôi nổi lung tung.
Nhớ ở nửa đầu trang, CLAUDE.local.md là một file ghi chú? Khi điều cần nhớ nhiều lên, một file phẳng sẽ vỡ: quá dài để đọc mỗi phiên, khó tìm, dễ trùng. Thanh thay bằng một kho bộ nhớ hiện có 141 file (mỗi mẩu một file) cộng một thư mục chờ duyệt, điều hướng bằng một mục lục hai tầng:
memory/
├── MEMORY.md # mục lục gọn (≤40 dòng) — chỉ trỏ đường
├── *_INDEX.md # 5 mục lục con, nạp khi cần đúng mảng đó
├── ... 141 file mẩu nhớ (mỗi mẩu 1 việc)
└── _pending/ # mẩu mới chờ tôi duyệt trước khi lưu
Mỗi phiên Claude chỉ đọc mục lục gọn rồi mở đúng 1–5 file cần thiết — không phải nuốt cả kho. Và bộ nhớ không tự ghi bừa: cuối phiên hệ thống đề xuất "điều này có đáng nhớ không", Thanh duyệt rồi mới lưu.
Mỗi dự án đi theo một đường rõ ràng, không vứt lung tung trên màn hình:
Mọi thứ mới bắt đầu ở khu nháp, thoải mái thử và xoá.
Khi quyết làm thật, dự án chuyển sang khu build — được giữ, không bị dọn.
Có repo, có bản trên mạng thì vào khu chính thức (đồng bộ với GitHub).
Bên cạnh là một khu riêng cho việc vận hành (bảng việc, lịch, nhật ký) — không bao giờ bị dọn — và một kho kiến thức gốc. Mỗi thứ có đúng một chỗ.