Bản đồ công trìnhTờ này lắp: Coding agent, Repo & CI
Bài nàyĐã họcChưa tớiĐã thay thế
Bạn sẽ học được gì
Tiêu chí nghiệm thu
Vì sao agent cần sổ tay
Nhớ lại bài Context engineering02-05: agent không nhớ gì giữa các phiên. Mỗi sáng bạn lại có một “nhân viên mới” rất giỏi nhưng chưa biết: dự án chạy test bằng lệnh nào, tiền lưu dạng gì, mã đơn có định dạng ra sao, thư mục nào không được đụng.
Có hai cách xử lý. Cách một: mỗi phiên dặn lại từ đầu, và thế nào cũng có hôm quên dặn. Cách hai: viết một cuốn sổ tay nhân viên đặt ở chỗ ai vào cũng thấy. Tiệm bánh nào cũng có bảng quy định dán trong bếp: “Rửa tay trước khi vào”, “Kem tươi để ngăn trên tủ mát số 2”, “Bánh kem ghi chữ phải đọc lại cho khách xác nhận”. Không ai dán cả giáo trình làm bánh lên tường; chỉ dán những điều mà thiếu nó là hỏng việc.
File hướng dẫn cho agent chính là tấm bảng đó.
AGENTS.md, CLAUDE.md và rules của từng công cụ
Bức tranh tại thời điểm viết (2026)
| File | Công cụ đọc | Ghi chú |
|---|---|---|
AGENTS.md |
Định dạng mở, được nhiều agent hỗ trợ: OpenAI Codex, Cursor, GitHub Copilot coding agent, Jules, Aider, Zed, Windsurf… | Markdown thuần, không bắt buộc cấu trúc; có thể đặt thêm trong thư mục con |
CLAUDE.md |
Claude Code | Có thể nhập nội dung file khác, ví dụ trỏ tới AGENTS.md |
.cursor/rules/ |
Cursor | Nhiều file quy tắc, có thể áp theo nhóm file |
.github/copilot-instructions.md |
GitHub Copilot | Hướng dẫn chung cho repo; có thêm file hướng dẫn theo đường dẫn |
GEMINI.md |
Gemini CLI | Mặc định; có thể cấu hình để đọc AGENTS.md |
Danh sách hỗ trợ thay đổi nhanh; hãy kiểm tra trang https://agents.md và tài liệu chính thức của công cụ bạn dùng.
Một nguồn sự thật, nhiều “cửa vào”
Nếu đội bạn dùng nhiều công cụ (chị Lan dùng agent dòng lệnh, Khoa dùng Cursor), đừng viết năm file với nội dung lặp lại; chúng sẽ lệch nhau sau vài tuần. Hãy chọn AGENTS.md làm nguồn chính, các file riêng chỉ trỏ tới nó. Ví dụ CLAUDE.md có thể chỉ gồm một dòng nhập nội dung AGENTS.md:
@AGENTS.md
Nếu cần thêm hướng dẫn chỉ dành cho một công cụ (ví dụ cách dùng một tính năng riêng của nó), ghi vào file riêng đó, phía dưới dòng trỏ.
AGENTS.md lồng nhau
Với dự án lớn có nhiều phần khác biệt, có thể đặt thêm AGENTS.md trong thư mục con, ví dụ src/db/AGENTS.md chứa quy tắc riêng cho database. Nhiều agent đọc file gần nhất với file đang sửa. Với Mộc OMS giai đoạn MVP, một file ở gốc là đủ; đừng phức tạp hóa sớm.
Nội dung nên có và không nên có
Phép thử một câu
Với mỗi dòng trong file hướng dẫn, hỏi: “Nếu bỏ dòng này, agent có làm sai không?“ Nếu không, xóa nó. File càng dài, những quy tắc quan trọng càng dễ bị lờ đi, vì chúng bị chìm giữa những dòng hiển nhiên. Đây là cùng nguyên lý “chú ý loãng” của bài trước.
Bảng nên và không nên
| ✅ Nên có | Ví dụ | ❌ Không nên có | Vì sao |
|---|---|---|---|
| Lệnh build, test, lint mà agent không đoán được | npm run test:e2e cần chạy npm run db:seed trước |
Điều agent tự đọc code là biết | Tốn chỗ, agent đã tự thấy |
| Quy ước khác mặc định | Tiền là bigint VNĐ, không dùng số thực |
Quy ước chuẩn của ngôn ngữ | “Dùng camelCase cho biến” là mặc định của TypeScript |
| Cách chạy một test đơn lẻ | npx vitest run tests/unit/order-total.test.ts |
Tài liệu API dài | Dẫn đường link hoặc đường dẫn file thay vì chép |
| Quy ước repo | Tên nhánh, quy ước commit, quy trình PR | Thông tin hay thay đổi | Danh sách task tuần này, số phiên bản cụ thể dễ lỗi thời |
| Quyết định kiến trúc riêng của dự án | Mọi ghi dữ liệu đi qua server action trong src/features/*/actions.ts |
Giải thích dài dòng lịch sử quyết định | Để trong ADR, AGENTS.md chỉ trỏ tới |
| Biến môi trường bắt buộc | Cần DATABASE_URL, NEXT_PUBLIC_SUPABASE_URL trong .env.local |
Mô tả từng file một | Agent tự liệt kê được thư mục |
| Cạm bẫy đã từng gặp | Không dùng service role key ở phía trình duyệt | Lời khuyên hiển nhiên | “Viết code sạch, dễ đọc” không thay đổi hành vi |
| Chỉ đường tới tài liệu | Spec ở docs/specs/, ADR ở docs/adr/ |
Bí mật | Không bao giờ ghi khóa, mật khẩu vào file hướng dẫn |
Dán AGENTS.md → đếm dòng (cảnh báo > 60), đánh dấu câu chung chung (‘code sạch’, ‘chú ý bảo mật’), chuỗi giống khóa bí mật, dòng nên chuyển sang skill/hook theo bảng ‘chọn lớp nào’; nạp sẵn bài tập 5 dòng rác
Bàn thử cần bật JavaScript.
Kết quả chỉ để tham khảo, không thay cho việc bạn tự duyệt.
AGENTS.md mẫu cho banhmoc-oms
Dưới đây là phiên bản tham khảo cho repo banhmoc-oms giai đoạn MVP. Lưu ý độ dài: đủ để đọc trong một phút.
# AGENTS.md — banhmoc-oms
Hệ thống quản lý đơn hàng (Mộc OMS) cho chuỗi tiệm bánh Bánh Mộc.
Next.js App Router + TypeScript, Supabase (Postgres, Auth), Drizzle ORM, Zod, Tailwind + shadcn/ui.
## Lệnh
- Cài đặt: `npm install` (Node theo `.nvmrc`)
- Chạy local: `npm run dev` (cần `.env.local`, mẫu ở `.env.example`)
- Kiểm tra trước khi báo xong: `npm run typecheck && npm run lint && npx vitest run --reporter=dot`
- Một file test: `npx vitest run tests/unit/<ten-file>.test.ts`
- E2E: `npm run db:seed` rồi `npm run test:e2e`
- Migration: sửa `src/db/schema.ts` → `npm run db:generate` → đọc file SQL sinh ra. KHÔNG tự chạy migration lên database ngoài local.
## Quy ước dữ liệu (bắt buộc)
- Tiền: số nguyên VNĐ (`bigint`), không dùng số thực. Định dạng hiển thị bằng `formatVND` trong `src/lib/format.ts`.
- Thời gian: lưu `timestamptz`, hiển thị theo Asia/Ho_Chi_Minh qua `src/lib/time.ts`.
- Trạng thái đơn: `moi → da_xac_nhan → dang_lam → dang_giao → hoan_tat`, hoặc `da_huy`. Mọi thay đổi trạng thái đi qua `src/features/orders/status.ts` và ghi `order_status_history`.
- Mã đơn: `BM-YYMMDD-XXX`, sinh ở server, không sinh ở client.
- Số điện thoại: chuẩn hóa bằng `normalizePhone` trước khi lưu hoặc tìm.
## Kiến trúc
- Mỗi tính năng trong `src/features/<ten>/` (actions.ts, queries.ts, schema.ts, components/).
- Ghi dữ liệu qua server action; validate đầu vào bằng Zod ở server, kể cả khi client đã validate.
- Phân quyền theo vai trò `owner | manager | staff`; kiểm tra ở server và bằng RLS. Xem `docs/adr/0003-phan-quyen.md`.
## Ranh giới
- Không cài thư viện mới khi chưa hỏi.
- Không dùng `SUPABASE_SERVICE_ROLE_KEY` trong code chạy ở trình duyệt.
- Không sửa `.env*` (trừ `.env.example`), không đọc `node_modules/`, `.next/`, file lock.
- Không sửa hoặc xóa test để cho qua; sửa nguyên nhân gốc.
## Git
- Nhánh: `feat/...`, `fix/...`, `chore/...`. Commit theo Conventional Commits, tiếng Việt được.
- Mỗi PR một thay đổi nhỏ; mô tả PR nêu cách đã kiểm chứng.
## Tài liệu
- Yêu cầu: `docs/PRD.md`; spec từng tính năng: `docs/specs/`; quyết định kiến trúc: `docs/adr/`.
- Khi thay đổi ảnh hưởng spec, cập nhật spec trong cùng PR.
Vài điểm đáng chú ý trong mẫu:
- Không có câu nào kiểu “hãy viết code chất lượng”. Mọi dòng đều cụ thể, kiểm tra được.
- Lệnh “kiểm tra trước khi báo xong” đặt ngay đầu, biến tiêu chí kiểm chứng thành mặc định của mọi phiên.
- Chỉ đường thay vì chép: quy tắc phân quyền chi tiết nằm trong ADR, AGENTS.md chỉ trỏ tới.
- Ranh giới viết dạng phủ định rõ ràng, vì đó là những chỗ agent hay “tiện tay”.
Skills và lệnh tùy biến cho quy trình lặp lại
Vấn đề: quy trình dài không hợp với AGENTS.md
Một số việc lặp lại có quy trình nhiều bước: tạo migration database, thêm một trạng thái đơn mới, viết spec theo mẫu, chuẩn bị bản phát hành. Nếu nhét toàn bộ quy trình vào AGENTS.md, file sẽ phình to và mọi phiên đều phải “cõng” nội dung chỉ cần vài lần một tháng.
Skill: cẩm nang nạp khi cần
Skill là một thư mục chứa file SKILL.md (và có thể kèm script, mẫu tài liệu) mô tả kiến thức chuyên biệt hoặc quy trình lặp lại. Điểm then chốt: thường chỉ phần mô tả ngắn của skill nằm sẵn trong ngữ cảnh; agent tự nạp nội dung đầy đủ khi thấy việc đang làm khớp với mô tả, hoặc khi bạn gọi tên. Vì vậy bạn có thể có hàng chục skill mà không làm phình ngữ cảnh mỗi phiên.
Tại thời điểm viết (2026), định dạng skill dạng thư mục có SKILL.md được Claude Code hỗ trợ và đang được nhiều công cụ khác áp dụng; vị trí thư mục và cách gọi khác nhau giữa các công cụ, hãy xem tài liệu chính thức. Ví dụ một skill cho Mộc OMS, đặt tại .claude/skills/tao-migration/SKILL.md:
---
name: tao-migration
description: Quy trình thay đổi schema database bằng Drizzle cho banhmoc-oms. Dùng khi cần thêm hoặc sửa bảng, cột, chỉ mục, ràng buộc.
---
# Tạo migration an toàn
1. Đọc `src/db/schema.ts` và spec liên quan trong `docs/specs/` trước khi sửa.
2. Sửa schema. Tiền dùng `bigint`, thời gian dùng `timestamp with time zone`.
3. Chạy `npm run db:generate`. Mở file SQL mới trong `src/db/migrations/` và kiểm tra:
- Có lệnh xóa cột hoặc bảng không? Nếu có, DỪNG và hỏi người dùng.
- Cột mới NOT NULL trên bảng đã có dữ liệu có giá trị mặc định chưa?
4. Áp dụng lên database local: `npm run db:migrate:local`. Không chạy lên database khác.
5. Cập nhật `src/db/seed.ts` nếu cần dữ liệu mẫu cho cột mới.
6. Cập nhật hoặc thêm test liên quan; chạy lệnh kiểm tra trong AGENTS.md.
7. Báo cáo: file SQL sinh ra (dán nội dung), rủi ro với dữ liệu hiện có, cách quay lui.
Lưu ý phần description: đây là thứ agent đọc để quyết định khi nào dùng skill, nên phải nói rõ khi nào cần nó. Các lệnh như db:migrate:local là ví dụ; dự án của bạn đặt tên script trong package.json thế nào thì ghi đúng thế ấy. Chi tiết về migration an toàn có ở bài Database production và migration10-05.
Lệnh tùy biến: prompt đóng gói
Lệnh tùy biến (custom command, thường gọi bằng dấu gạch chéo như /review-pr) là một prompt bạn hay dùng, lưu thành file để gọi nhanh. Khác với skill (agent có thể tự nạp khi thấy phù hợp), lệnh tùy biến thường do bạn chủ động gọi. Ví dụ những lệnh chị Lan hay dùng: /phong-van-spec (phỏng vấn ngược rồi viết spec), /ban-giao (viết file bàn giao trước khi làm mới phiên), /review-diff (review thay đổi so với spec). Nhiều công cụ hỗ trợ cơ chế này; ở một số công cụ, skill và lệnh tùy biến đã gộp làm một.
| Cơ chế | Nạp khi nào | Hợp với | Ví dụ |
|---|---|---|---|
| AGENTS.md | Mọi phiên | Quy ước ngắn, lệnh, cạm bẫy | “Tiền là bigint VNĐ” |
| Skill | Khi việc khớp mô tả hoặc khi được gọi | Quy trình dài, kiến thức chuyên biệt | Quy trình tạo migration |
| Lệnh tùy biến | Khi bạn gọi | Prompt hay dùng | /ban-giao |
| Hook | Tự động tại thời điểm cố định | Quy tắc bắt buộc | Chặn sửa .env |
Hooks: quy tắc bắt buộc tự động
Khuyến nghị và bắt buộc
Mọi thứ viết trong AGENTS.md hay skill đều là khuyến nghị: agent thường làm theo, nhưng không có gì đảm bảo. Phần lớn thời gian thế là đủ. Nhưng có những quy tắc mà vi phạm một lần là quá đắt: sửa file bí mật, đẩy code chưa qua kiểm tra, chạy lệnh xóa dữ liệu.
Hook là script chạy tự động tại các thời điểm cố định trong vòng lặp agent: trước khi agent dùng một công cụ, sau khi sửa file, khi agent định kết thúc lượt làm việc… Hook không phụ thuộc vào việc agent “nhớ” hay “đồng ý”; nó luôn chạy. Có thể ví hook như cảm biến khói trong bếp: không ai cần nhắc, nó tự kêu.
- AGENTS.md: khuyến nghị, mọi phiên
- Skill: quy trình, nạp khi cần
- Hook: bắt buộc, chạy tự động trên máy
- Git hook / CI: chốt chặn cuối, độc lập công cụ
- Không được sửa file bí mật
Xem sơ đồ gốc (Hình 1)
Vuốt ngang để xem hết sơ đồ
Vuốt ngang để xem hết sơ đồ
Đọc sơ đồ dạng chữ
- AGENTS.md: khuyến nghị, mọi phiên → Skill: quy trình, nạp khi cần
- Skill: quy trình, nạp khi cần → Hook: bắt buộc, chạy tự động trên máy
- Hook: bắt buộc, chạy tự động trên máy → Git hook / CI: chốt chặn cuối, độc lập công cụ
Ví dụ hook trong Claude Code
Hook được cấu hình trong file cài đặt của dự án. Ví dụ sau làm hai việc: chặn agent sửa file .env thật, và tự định dạng code sau mỗi lần agent sửa file.
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/chan-sua-env.sh" }
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write --ignore-unknown" }
]
}
]
}
}
Script chặn sửa file bí mật:
#!/usr/bin/env bash
# .claude/hooks/chan-sua-env.sh
# Agent gửi thông tin lời gọi công cụ dạng JSON qua stdin; lấy đường dẫn file định sửa
file=$(jq -r '.tool_input.file_path // empty')
case "$file" in
*.env|*.env.*)
if [[ "$file" != *.env.example ]]; then
echo "Không được sửa file bí mật: $file. Hãy cập nhật .env.example và báo người dùng." >&2
exit 2 # mã thoát 2: chặn hành động và gửi lý do lại cho agent
fi
;;
esac
exit 0
Tên sự kiện, cú pháp và cách truyền dữ liệu là của Claude Code tại thời điểm viết (2026); một số agent khác cũng có cơ chế hook tương tự với cú pháp riêng. Hãy đối chiếu tài liệu chính thức trước khi dùng.
Lớp bắt buộc không phụ thuộc công cụ
Nếu công cụ của bạn không có hook, hoặc đội dùng nhiều công cụ, vẫn có hai lớp bắt buộc độc lập:
- Git hook chạy trên máy trước khi commit (thường thiết lập qua công cụ như husky hoặc lefthook): chạy lint, type check, quét secret. Áp dụng cho cả người lẫn agent.
- CI trên GitHub Actions: mọi pull request phải qua test, lint, type check mới được merge. Đây là chốt chặn cuối cùng, không ai bỏ qua được. Xem bài CI/CD với GitHub Actions10-04 và Kiểm tra tĩnh08-06.
Chọn lớp nào cho quy tắc nào
| Quy tắc | Lớp phù hợp | Lý do |
|---|---|---|
| “Tiền dùng bigint” | AGENTS.md + test | Cần hiểu ngữ cảnh; test bắt vi phạm |
| “Quy trình tạo migration” | Skill | Dài, chỉ cần khi làm migration |
| “Định dạng code” | Hook sau khi sửa file | Máy móc, không cần agent nhớ |
| “Không sửa .env” | Hook chặn trước khi sửa | Vi phạm một lần là rủi ro |
| “Không merge khi test đỏ” | CI | Chốt chặn cuối, áp dụng cho mọi người |
Giữ file hướng dẫn tiến hóa cùng dự án
File hướng dẫn là tài liệu sống, không phải văn bản viết một lần:
- Đưa vào Git. Mọi thay đổi AGENTS.md, skill, hook đều qua pull request, để cả đội thấy và góp ý.
- Thêm khi có lỗi lặp lại. Agent mắc cùng một lỗi hai lần là tín hiệu thêm một dòng.
- Xóa khi không còn cần. Quy tắc cho thư viện đã gỡ, cạm bẫy đã được hook chặn: xóa khỏi AGENTS.md.
- Rà soát định kỳ (ví dụ hằng tháng): đọc lại từng dòng với phép thử “bỏ đi có sai không”.
- Nhờ agent đề xuất, bạn quyết định: “Dựa trên phiên vừa rồi, có điều gì nên thêm vào AGENTS.md để lần sau không phải nhắc? Đề xuất tối đa 3 dòng, ngắn gọn.”
- Kiểm tra hiệu quả: nếu agent liên tục làm trái một dòng đã có, có thể dòng đó diễn đạt mơ hồ, bị chìm giữa file quá dài, hoặc cần chuyển thành hook.
Áp dụng vào dự án Bánh Mộc
Nhật ký công trình · Bánh Mộc
BM-261012-020
12.10.2026
- Chị LanChủ chuỗi
- KhoaFreelancer

Phiên bản AGENTS.md đầu tiên của chị Lan dài gần 300 dòng. Chị chép cả PRD vào, liệt kê từng file, thêm những câu như “hãy viết code dễ hiểu”, “luôn chú ý bảo mật”. Kết quả trái ngược mong đợi: agent vẫn thỉnh thoảng dùng số thực cho tiền, dù quy tắc đó nằm ở dòng 187.
Chị áp dụng phép thử từng dòng, cắt xuống còn khoảng 50 dòng như mẫu ở trên. PRD chuyển về docs/PRD.md, AGENTS.md chỉ trỏ tới. Quy tắc tiền được đưa lên đầu mục “Quy ước dữ liệu (bắt buộc)”. Từ đó lỗi số thực không lặp lại.
Hai tuần sau, có lần agent sửa .env.local để “tiện” thêm một biến môi trường, làm hỏng cấu hình kết nối Supabase của chị. Dòng “Không sửa .env*” vẫn nằm đó, nhưng đó chỉ là khuyến nghị. Chị nhờ agent viết hook chặn sửa file .env (như ví dụ ở trên), đọc kỹ script trước khi bật. Từ đó, vi phạm không thể xảy ra nữa, và dòng trong AGENTS.md vẫn giữ để agent hiểu lý do.
Khi làm migration thêm cột zalo_id cho bảng customers, chị nhận ra mình dặn agent cùng một quy trình lần thứ ba. Chị biến nó thành skill tao-migration. Lần sau chỉ cần nói “thêm cột birthday_reminder_sent_at cho customers”, agent tự nạp skill và làm đúng bảy bước.
Khi Khoa tham gia ở giai đoạn 4, anh dùng Cursor. Vì AGENTS.md là nguồn chính, Cursor đọc được ngay; Khoa chỉ thêm một vài quy tắc riêng cho giao diện trong thư mục rules của Cursor, phía dưới ghi chú “quy tắc chung xem AGENTS.md”. CI trên GitHub là chốt chặn chung cho cả hai.
Prompt mẫu
Nhờ agent soạn AGENTS.md phiên bản đầu từ dự án có sẵn:
Điền ô trống rồi sao chép
Đọc package.json, cấu trúc thư mục src/, docs/ và các file cấu hình.
Soạn AGENTS.md cho repo này, tối đa 60 dòng, gồm: lệnh (cài, chạy, kiểm tra, test một file),
quy ước dữ liệu khác mặc định, kiến trúc thư mục, ranh giới (điều không được làm), Git, chỉ đường tài liệu.
Với mỗi dòng, tự hỏi "bỏ dòng này agent có làm sai không?"; nếu không thì bỏ.
Không chép tài liệu dài, không ghi giá trị bí mật. Trình bày bản nháp để mình duyệt, chưa ghi file.
Rà soát AGENTS.md hiện có:
Điền ô trống rồi sao chép
Đọc AGENTS.md. Với từng dòng, đánh giá: giữ / rút gọn / chuyển sang docs hoặc skill / xóa,
kèm lý do một câu. Chỉ ra dòng nào nên chuyển thành hook vì vi phạm quá đắt.
Không sửa file, chỉ trả về bảng đề xuất.
Đóng gói quy trình thành skill:
Điền ô trống rồi sao chép
Mình vừa hướng dẫn bạn quy trình [tên quy trình] trong phiên này.
Hãy viết thành skill tại [đường dẫn thư mục skill theo công cụ]/[ten-skill]/SKILL.md:
frontmatter có name và description (nêu rõ KHI NÀO dùng), thân là các bước đánh số, ngắn,
có bước kiểm chứng và điều kiện phải dừng lại hỏi người dùng.
Sai lầm thường gặp
-
Sự cố 01
File hướng dẫn quá dài.
Triệu chứngQuy tắc quan trọng bị chìm, agent lờ đi.
Cách tránhPhép thử từng dòng; chuyển nội dung dài sang
docs/hoặc skill; giữ AGENTS.md trong vài chục dòng. -
Sự cố 02
Viết lời khuyên chung chung.
Triệu chứng“Viết code sạch”, “chú ý bảo mật” không thay đổi hành vi agent.
Cách tránhThay bằng quy tắc cụ thể, kiểm tra được: “Validate đầu vào bằng Zod ở server.”
-
Sự cố 03
Dựa vào khuyến nghị cho quy tắc sống còn.
Triệu chứngAGENTS.md không đảm bảo agent tuân thủ 100%.
Cách tránhQuy tắc mà vi phạm một lần là quá đắt thì làm thành hook, Git hook hoặc CI.
-
Sự cố 04
Nhiều file hướng dẫn lặp nội dung cho từng công cụ.
Triệu chứngSau vài tuần chúng lệch nhau, agent nhận chỉ dẫn mâu thuẫn.
Cách tránhAGENTS.md là nguồn chính, file riêng của công cụ chỉ trỏ tới và thêm phần riêng.
-
Sự cố 05
Viết một lần rồi bỏ quên.
Triệu chứngTài liệu lỗi thời khiến agent làm sai một cách tự tin.
Cách tránhĐưa vào Git, sửa qua PR, rà soát định kỳ, thêm dòng khi có lỗi lặp lại.
-
Sự cố 06
Ghi bí mật vào file hướng dẫn.
Triệu chứngFile này được commit và đọc bởi nhiều công cụ.
Cách tránhChỉ ghi tên biến môi trường; giá trị để trong
.env.local.
Checklist
Bài tập thực hành
-
Bài 1
Cơ bản
Phép thử từng dòng
Lấy mẫu AGENTS.md trong bài, thêm vào 5 dòng “rác” (ví dụ “Viết code dễ đọc”, “Dùng TypeScript”). Đưa cho một người bạn (hoặc một phiên AI mới) và yêu cầu áp dụng phép thử từng dòng.
Kết quả mong đợi
5 dòng rác bị loại, cùng lý do. Bạn luyện được con mắt nhận ra dòng thừa.
-
Bài 2
Cơ bản
Viết AGENTS.md cho dự án của bạn
Với dự án thực hành của bạn, viết AGENTS.md không quá 50 dòng theo cấu trúc: lệnh, quy ước, kiến trúc, ranh giới, Git, tài liệu.
Kết quả mong đợi
Một file mà người khác đọc trong một phút là biết cách chạy, kiểm tra và những điều không được làm trong dự án.
-
Bài 3
Nâng cao
Một skill và một hook
Chọn một quy trình bạn đã lặp lại ít nhất hai lần, viết thành skill. Chọn một quy tắc sống còn, viết hook (hoặc Git hook nếu công cụ không có hook) để thực thi nó. Thử cố tình yêu cầu agent vi phạm quy tắc.
Kết quả mong đợi
Agent tự nạp skill khi việc khớp mô tả; hook chặn hành động vi phạm và agent nhận được lý do.
Thuật ngữ trong bài
- AGENTS.md
- File hướng dẫn dạng chuẩn mở cho coding agent, đặt trong repo
- CLAUDE.md
- File hướng dẫn mà Claude Code đọc; có thể trỏ tới AGENTS.md
- Rules
- File quy tắc riêng của từng công cụ, như thư mục rules của Cursor
- Skill
- Thư mục có SKILL.md chứa quy trình hoặc kiến thức, nạp khi cần
- Lệnh tùy biến (custom command)
- Prompt hay dùng được lưu lại, gọi bằng dấu gạch chéo
- Hook
- Script chạy tự động ở thời điểm cố định trong vòng lặp agent
- Git hook
- Script Git chạy tự động, ví dụ trước khi commit
- CI
- Tích hợp liên tục: tự động kiểm tra mỗi khi có thay đổi đẩy lên
- Conventional Commits
- Quy ước viết commit message có tiền tố như feat, fix, chore
Đọc thêm
- Định dạng AGENTS.md và danh sách công cụ hỗ trợ: https://agents.md
- Tài liệu CLAUDE.md, skills và hooks: https://code.claude.com/docs
- Tài liệu rules của Cursor: https://docs.cursor.com
- Hướng dẫn tùy biến Copilot cho repo: https://docs.github.com
- Quy ước commit: https://www.conventionalcommits.org
- Bài liên quan: Khởi tạo dự án đúng cách06-02, Quy ước commit và chiến lược nhánh07-04
Nghiệm thu tờ 02-06
Đọc xong và tự kiểm theo phiếu nghiệm thu, rồi đánh dấu tờ này.

