← Lập trình với Claude Code

Bài 7 · Nâng cao · 22 phút· Cập nhật 11/06/2026

Agent Skills

Biên soạn bởi Nguyễn Anh Tuấn

Đóng gói quy trình lặp lại thành Skill (SKILL.md): tiết lộ dần (progressive disclosure), allowed-tools, model tự gọi - khác gì slash command.

Bài trước bạn tạo lệnh bằng một file. Skill là dạng đầy đủ của cùng ý tưởng đó - vẫn tạo ra /tên, nhưng thêm ba thứ:

  • Một THƯ MỤC (kèm file phụ: scripts, tài liệu) thay vì chỉ một file.
  • Claude có thể TỰ GỌI khi phù hợp - nhờ phần mô tả (description).
  • Tiết lộ dần: gần như không tốn ngữ cảnh cho tới khi skill được dùng.

Khi nào tạo Skill

Khi bạn dán đi dán lại cùng một checklist/quy trình, hoặc khi một mục trong CLAUDE.md đã phình thành quy trình nhiều bước. Nhớ phân vai: CLAUDE.md giữ sự thật & luật; Skill gói quy trình gọi khi cần.

Mỗi skill là một thư mục chứa file SKILL.md: frontmatter (giữa hai dòng ---) cho biết khi nào dùng, rồi phần thân là hướng dẫn Claude làm theo. Tên thư mục chính là tên lệnh:

~/.claude/skills/tom-tat-thay-doi/SKILL.md

---
name: tom-tat-thay-doi
description: Tóm tắt các thay đổi chưa commit và gắn cờ chỗ rủi ro. Dùng khi người dùng hỏi đã đổi gì, muốn commit message, hoặc nhờ review diff.
---

!`git diff HEAD`

Tóm tắt các thay đổi ở trên bằng tiếng Việt, ngắn gọn.
Nêu rõ bất cứ thay đổi nào có thể gây rủi ro (xoá kiểm tra,
sửa logic thanh toán, đổi cấu hình…).
  • Vị trí: ~/.claude/skills/<tên>/SKILL.md (cá nhân) hoặc .claude/skills/<tên>/SKILL.md (dự án).
  • Tên THƯ MỤC = tên lệnh: tom-tat-thay-doi → /tom-tat-thay-doi.
  • name + description là cốt lõi; phần thân là hướng dẫn thực thi.

Đây là điểm khiến Skill khác biệt. Không phải mọi thứ đều nằm trong ngữ cảnh cùng lúc - nó nạp theo ba lớp:

1 · Luôn trong ngữ cảnh (rất rẻ)

Chỉ name + description - vài dòng, để Claude biết skill TỒN TẠI và khi nào dùng.

2 · Nạp KHI dùng

Phần thân SKILL.md (hướng dẫn đầy đủ) chỉ vào ngữ cảnh khi skill được gọi.

3 · Nạp KHI CẦN

File phụ kèm trong thư mục (tài liệu dài, scripts) chỉ đọc lúc thật sự cần tới.

Vì sao bạn cần biết điều này

Bạn có thể có hàng chục skill mà ngữ cảnh gần như không phình, vì phần nặng chỉ nạp khi dùng. Đây là lý do nên tách quy trình dài thành Skill thay vì nhồi hết vào CLAUDE.md (CLAUDE.md luôn nằm trong ngữ cảnh - xem bài “Cách hoạt động”).

Mặc định cả hai: bạn gõ /tên, hoặc Claude tự nạp khi câu chuyện khớp với description. Một description tốt giúp Claude gọi đúng lúc:

claude - ~/cua-hang-x

Tôi vừa thay đổi những gì? Có gì rủi ro không?

⤷ tự gọi skill: tom-tat-thay-doi (khớp description)

!`git diff HEAD` → (nhúng diff)

3 file đổi. Đáng chú ý: bỏ kiểm tra null trong payment.ts (dòng 42) - rủi ro. Còn lại là đổi giao diện an toàn.

Thử ngay - gõ một câu hỏi tự nhiên và xem skill nào tự được gọi (hoặc không), cùng lượng ngữ cảnh thay đổi ra sao:

Chọn một prompt - Claude tự gọi skill phù hợp mà không cần bạn gõ /tên. Xem phần thân skill chỉ nạp khi được gọi:

✓ skill tự gọi: /review-pr

Review các thay đổi trong PR hoặc diff. Dùng khi người dùng nhờ review, xem diff, hoặc kiểm code trước khi gộp.

280 token thân nạp vào ngữ cảnh lúc này. So sánh: nếu gõ /tên thì cũng tương tự - điểm khác là bạn không cần nhớ tên.

Ngữ cảnh đang dùng (đơn vị dạy)

90
280
Descriptions (3 skill × 30) = 90 Thân skill = 280 Tổng: 370
  • Mặc định: bạn gọi (/tên) VÀ Claude tự gọi (theo description).
  • description phải nêu “KHI NÀO dùng”, không chỉ “làm gì” - đó là tín hiệu để Claude tự gọi.
  • disable-model-invocation: true → CHỈ bạn gọi (hợp cho deploy/commit/gửi tin).

allowed-tools: chạy mượt thao tác an toàn

Liệt kê allowed-tools để skill dùng các công cụ đó không phải hỏi (vd Read, Grep). Nó không nới lỏng bảo mật tổng thể - luật quyền của bạn vẫn áp dụng; với skill trong dự án, nó chỉ hiệu lực sau khi bạn “tin” thư mục.

Bốn cách mở rộng đã/đang học - đừng nhầm vai của chúng:

Công cụDùng cho
CLAUDE.mdSự thật & luật LUÔN đúng (lệnh build, quy ước) - luôn trong ngữ cảnh.
Slash commandMột prompt hay dùng, gọi tay nhanh - dạng đơn giản.
SkillQuy trình nhiều bước (+ file phụ) Claude tự gọi khi cần - tiết lộ dần.
SubagentViệc phụ chạy trong NGỮ CẢNH RIÊNG, trả về tóm tắt (bài kế tiếp).

Tiếp theo: Subagents

Skill mở rộng việc Claude làm trong cùng ngữ cảnh. Bài kế tiếp - Subagents - cho một việc phụ chạy trong ngữ cảnh riêng biệt rồi chỉ trả về kết quả gọn, giúp ngữ cảnh chính luôn sạch.

Câu hỏi thường gặp

Hợp nhất nghĩa là cùng một cơ chế: cả hai tạo /tên và chạy như nhau. “Skill” chỉ là dạng ĐẦY ĐỦ: một THƯ MỤC (kèm file phụ) thay vì một file, có frontmatter để Claude TỰ GỌI khi phù hợp, và tải nội dung dần. Dùng dạng command (một file) cho việc đơn giản; nâng lên Skill khi cần file phụ hoặc muốn Claude tự gọi.

Khi bạn cứ dán đi dán lại cùng một checklist/quy trình nhiều bước, HOẶC khi một mục trong CLAUDE.md đã phình thành “quy trình” chứ không còn là “sự thật”. Quy tắc: CLAUDE.md giữ SỰ THẬT & LUẬT luôn đúng; Skill gói QUY TRÌNH gọi khi cần.

Là cách Skill tiết kiệm ngữ cảnh: LUÔN trong ngữ cảnh chỉ có name + description (vài dòng, rất rẻ). Phần THÂN skill chỉ nạp KHI skill được dùng. File tham khảo/scripts kèm theo chỉ nạp khi thật sự cần. Nhờ vậy bạn có thể có rất nhiều skill mà gần như không tốn ngữ cảnh tới lúc dùng.

Nó đọc trường description. Vì thế description phải nêu RÕ “khi nào dùng” - không chỉ skill làm gì. Vd: “Dùng khi người dùng hỏi điều gì đã thay đổi, muốn commit message, hoặc nhờ review diff.” Mô tả mơ hồ → Claude gọi sai lúc hoặc bỏ sót.

Thêm disable-model-invocation: true vào frontmatter. Khi đó CHỈ bạn gõ /deploy mới chạy; Claude không tự quyết định deploy vì “code trông có vẻ xong”. Dùng cho mọi skill có tác dụng phụ: deploy, commit, gửi tin nhắn…

Là các công cụ Claude được dùng KHÔNG cần hỏi phép khi skill đang chạy. Nó KHÔNG giới hạn công cụ (mọi công cụ vẫn gọi được, theo luật quyền của bạn) - chỉ giúp skill chạy mượt cho những thao tác an toàn đã liệt kê. Với skill commit vào dự án, allowed-tools chỉ có hiệu lực sau khi bạn “tin” thư mục đó.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

“Tiết lộ dần” (progressive disclosure) của Skill nghĩa là gì?

  1. 1

    Skill đầu tiên

    Tạo ~/.claude/skills/tom-tat-thay-doi/SKILL.md: frontmatter name + description, thân chèn !git diff HEAD và yêu cầu tóm tắt thay đổi, gắn cờ chỗ rủi ro.

    Hoàn thành khi: Sửa một file bất kỳ rồi gõ /tom-tat-thay-doi → Claude tóm tắt đúng diff hiện tại.

  2. 2

    Để Claude tự gọi

    Viết description thật rõ “khi nào dùng”. Rồi THAY VÌ gõ lệnh, hãy hỏi tự nhiên: “Tôi vừa đổi những gì?” và xem Claude có tự gọi skill không.

    Hoàn thành khi: Claude tự nhận ra và chạy skill nhờ description khớp câu hỏi của bạn.

  3. 3

    Chỉ mình tôi gọi

    Tạo một skill /deploy (giả lập, chỉ in các bước) và thêm disable-model-invocation: true. Kiểm chứng Claude không tự chạy nó.

    Hoàn thành khi: Chỉ khi bạn gõ /deploy nó mới chạy; hỏi bâng quơ không kích hoạt nó.

  4. 4

    Skill hay CLAUDE.md?

    Phân loại: (a) “dự án dùng pnpm”, (b) “quy trình phát hành phiên bản gồm 6 bước”. Cái nào vào CLAUDE.md, cái nào thành Skill?

    Hoàn thành khi: (a) sự thật → CLAUDE.md; (b) quy trình nhiều bước → Skill (gọi khi cần, không tốn ngữ cảnh thường trực).

  5. 5

    Mô tả tốt

    Viết lại một description mơ hồ (“Quản lý test”) thành rõ ràng nêu khi nào dùng.

    Hoàn thành khi: Vd: “Chạy & sửa test thất bại. Dùng khi người dùng báo test fail hoặc nhờ chạy bộ test.” - nêu rõ tình huống kích hoạt.