Tháng đầu dùng Claude Code, tôi hiểu vỡ vạc mỗi thứ. Đọc docs thấy nhắc đến “skills”, rồi lại “commands”, rồi “agents”, rồi “plugins” — tôi cứ nghĩ đây là 4 tên gọi khác nhau của cùng một thứ. Mò tiếp thì thấy “hooks”, “CLAUDE.md”, “permissions”… Ôi thôi.
Kết quả: tôi build mọi thứ theo cách không optimal. Commands thay vì skills. Hardcode trong CLAUDE.md thay vì dùng agents. Ignore hooks rồi tự hỏi sao workflow cứ phải làm thủ công.
Bài này là những gì tôi ước gì ai đó viết cho tôi đọc từ sớm hơn. Sau khi đọc xong, bạn sẽ biết chính xác từng component là gì, khi nào dùng cái nào, và cách chúng kết hợp với nhau tạo thành một workflow xịn.
Bản Đồ Thành Phần
Trước khi đi vào từng thứ, nhìn tổng thể cái đã:
project-root/├── CLAUDE.md ← Bộ nhớ dự án (project memory)├── .claude/│ ├── settings.json ← Hooks config + permissions│ ├── skills/ ← Skills (kỹ năng chuyên môn)│ │ └── my-skill/│ │ └── SKILL.md│ ├── commands/ ← Commands (legacy, đã merge vào skills)│ │ └── my-command.md│ └── agents/ ← Sub-agents (nhân viên phụ)│ └── my-agent.md└── .claude-plugin/ ← Plugin bundle (gói cài đặt) └── plugin.jsonMột câu tóm tắt mỗi component:
| Component | Vai trò |
|---|---|
| CLAUDE.md | Tài liệu onboarding cho AI — đọc tự động mỗi session |
| Skills | Kỹ năng/workflow mà bạn dạy Claude một lần, dùng mãi |
| Commands | Shortcut ngắn gọn cho tasks hay dùng (đã merge vào Skills) |
| Hooks | Scripts tự động chạy khi có sự kiện (pre/post tool use) |
| Agents | Sub-Claude với role và rules riêng, chạy song song |
| Plugins | Bundle hoàn chỉnh đóng gói tất cả trên để chia sẻ |
| Permissions | Bộ lọc kiểm soát file và thư mục Claude được phép đụng |
Bây giờ đi sâu vào từng cái.
1. CLAUDE.md — Bộ Nhớ Dự Án
Nó là gì?
CLAUDE.md là file markdown đặc biệt mà Claude Code tự động đọc vào đầu mỗi session. Không cần config gì thêm. Đặt file vào đúng chỗ là nó tự load.
Claude Code hỗ trợ 6 level CLAUDE.md, load theo thứ tự ưu tiên từ trên xuống:
| Level | Vị trí | Phạm vi |
|---|---|---|
| Managed policy | Cấu hình từ tổ chức (enterprise) | Toàn công ty |
| User memory | ~/.claude/CLAUDE.md | Tất cả projects của bạn |
| Project memory | ./CLAUDE.md ở root | Cả project |
| Project local | .claude/CLAUDE.md | Cả project (gitignored) |
| Project rules | .clauderules | Chỉ rules, không markdown |
| Auto memory | Claude tự thêm khi bạn nói “nhớ cái này” | Theo session |
Tính năng hay: CLAUDE.md hỗ trợ @path/to/import để include file khác. Bạn có thể split thành nhiều file cho gọn:
@docs/conventions.md@docs/architecture.md@docs/security-rules.mdVà các thư mục con có thể có CLAUDE.md riêng — sẽ được load on-demand khi Claude làm việc trong thư mục đó.
Ví dụ thực tế
# CLAUDE.md — PaymentAPI Backend
## Tech Stack- Kotlin + Spring Boot 3.2- PostgreSQL + Redis- Kafka cho event streaming- Docker + Kubernetes (GKE)
## Conventions- Files: snake_case- API endpoints: kebab-case (/user-preferences, không phải /userPreferences)- Business logic KHÔNG được phép nằm trong controllers — delegate sang services- Error responses: luôn dùng `ApiError` data class
## KHÔNG ĐƯỢC làm- Commit vào main trực tiếp- Hardcode credentials- Thêm dependency mới mà không hỏi trước
## Files cần tránh- src/main/resources/application-prod.yml- k8s/secrets/5 Analogies
- Bản lệnh chiến đấu trước khi xuất quân — mỗi lần ra trận, ai cũng đọc brief về địa hình, mục tiêu, rules of engagement. CLAUDE.md là brief đó cho mỗi session.
- Cuốn cẩm nang “hiểu bạn đời” — nếu ai đó viết ra hết “anh thích ăn gì, ghét gì, cái gì trigger anh” thì bạn không cần mò mẫm từng ngày. Relationship level up ngay.
- Backstory của nhân vật trong RPG — trước khi bắt đầu quest, character đã có lore, skills, và constraints riêng. Không phải blank slate.
- Company handbook ngày đầu đi làm — không ai bắt đầu công việc mới mà không đọc handbook. Nếu không có, bạn sẽ vi phạm quy định mà không biết.
- Bio “About me” trên profile GitHub — flex nhẹ về stack, nêu rõ gì hay dùng, giúp người mới hiểu bạn ngay mà không cần hỏi.
Khi nào dùng
Luôn luôn. Mọi project đều nên có CLAUDE.md. Bắt đầu với 10 dòng là đủ, thêm dần theo thời gian. Mỗi lần Claude Code output sai convention, thêm correction vào CLAUDE.md luôn để không lặp lại.
Lỗi hay gặp
- Viết CLAUDE.md quá chung chung (“use best practices”) — Claude Code cần specifics, không phải platitudes
- Quên update khi project thay đổi — file lỗi thời còn tệ hơn không có file
- Nhét hết mọi thứ vào một file khổng lồ — dùng
@importđể split cho dễ maintain
2. Skills — Kỹ Năng Chuyên Môn
Nó là gì?
Skills là cách bạn dạy Claude Code một workflow phức tạp, một lần, và invoke lại bất cứ lúc nào.
Skills sống trong thư mục (không phải file đơn lẻ):
.claude/skills/└── review-pr/ ├── SKILL.md ← Định nghĩa skill (bắt buộc) ├── instructions.md ← Chi tiết hướng dẫn (optional) └── examples/ ← Examples cho Claude tham khảo (optional)File SKILL.md có YAML frontmatter:
---name: review-prdescription: "Review pull request theo checklist của team"triggers: - "review pr" - "review pull request" - "/review-pr"tools: - Read - Bash - Write---
# PR Review Skill
Khi được gọi, thực hiện review theo các bước sau:
1. Đọc danh sách files thay đổi: `git diff --name-only HEAD~1`2. Với mỗi file thay đổi: - Kiểm tra naming conventions theo CLAUDE.md - Kiểm tra có tests không - Kiểm tra error handling - Kiểm tra potential security issues3. Tạo report theo format: `## PR Review\n### ✅ Good\n### ⚠️ Issues\n### ❌ Blockers`4. Nếu có blockers, output exit code 1
## Format báo cáo
...Invoke bằng cách nói tự nhiên (khớp với triggers) hoặc gọi trực tiếp: /review-pr.
Lưu ý quan trọng: Skills đã merge Commands vào trong mình. Commands là legacy feature — bạn vẫn có thể dùng, nhưng Skills mạnh hơn nhiều và là cách được khuyến nghị từ giờ.
Ví dụ thực tế — Skill tạo migration
---name: create-migrationdescription: "Tạo database migration mới theo đúng convention của team"triggers: - "tạo migration" - "new migration" - "/create-migration"tools: - Read - Write - Bash---
# Create Migration Skill
## Steps
1. Đọc migration mới nhất trong `db/migrations/` để lấy số thứ tự2. Tạo file mới: `db/migrations/V{next_number}__{description}.sql`3. Thêm comment header: ```sql -- Migration: {description} -- Date: {today} -- Author: {từ git config} -- Jira: {ticket nếu có}- Tạo file rollback tương ứng:
db/migrations/V{number}__rollback_{description}.sql - Cập nhật
db/MIGRATION_LOG.md
Naming Rules
- Description dùng snake_case
- Động từ đầu tiên: add, remove, alter, create, drop
- Ví dụ:
V042__add_user_preferences_table.sql
### 5 Analogies
- **Khóa huấn luyện đặc biệt** — lính bình thường bắn súng. Lính đặc nhiệm học thêm bắn tỉa, y tế chiến trường, xử lý bom. Skills là những khóa đó.- **Thứ partner học riêng cho bạn** — bạn thích phở tái, partner tự học cách nấu đúng kiểu Hà Nội. Không phải kỹ năng ai cũng có, nhưng họ học vì bạn cần.- **Passive skill đã equip trong game** — một khi equip, nó auto active khi điều kiện đúng. Không cần micro-manage từng lần.- **Chuyên môn từng phòng ban** — kế toán biết Excel pivot table cao cấp. Dev ops biết Kubernetes. Không phải ai trong công ty cũng cần biết, nhưng người đó biết rất sâu.- **"Cái thứ bạn cracked at"** — mục đầu tiên trên LinkedIn Skills. Người ta gọi là để làm cái đó, không phải để giải thích từ đầu.
### Khi nào dùng
Dùng Skills khi bạn có một workflow hay làm đi làm lại nhưng đủ phức tạp để describe mỗi lần là tốn công. Code review, tạo component mới theo template, generate changelog, deploy checklist — đây đều là skill candidates.
### Lỗi hay gặp
- Tạo skill quá broad ("do everything") — một skill tốt là một skill focused- Không viết examples — Claude Code học tốt hơn từ examples hơn là instructions- Đặt skill ở `~/.claude/skills/` khi nó chỉ relevant cho một project cụ thể
---
## 3. Commands — Lệnh Tắt (Legacy)
### Nó là gì?
Commands là cách cũ để tạo shortcuts ngắn gọn cho Claude Code. Mỗi command là một file `.md` trong `.claude/commands/`:.claude/commands/ ├── deploy.md ├── standup.md └── review.md
File command đơn giản hơn skill nhiều:
```markdownTóm tắt những gì tôi đã làm hôm qua dựa vào git log:```bashgit log --since="yesterday" --author="$(git config user.email)" --onelineFormat theo daily standup: “Yesterday I…”, “Today I plan to…”, “Blockers: …”
Invoke bằng: `/standup` — hoặc bất kỳ lúc nào bạn nhắc đến tên file.
Commands hỗ trợ `$ARGUMENTS` để nhận tham số:
```markdown<!-- .claude/commands/ticket.md -->Tạo feature branch và PR template cho ticket $ARGUMENTS.Tên branch: feature/$ARGUMENTS-brief-descriptionGọi: /ticket PROJ-1234
Tại sao giờ ít dùng hơn
Commands đã được merge vào Skills. Về kỹ thuật bạn vẫn có thể dùng, nhưng Skills có:
- YAML frontmatter để config rõ ràng hơn
- Thư mục riêng để tổ chức examples và instructions
- Trigger keywords tự nhiên hơn (không cần nhớ tên command chính xác)
Nếu bạn đang viết command mới, xem xét viết skill thay thế.
5 Analogies
- Mật danh liên lạc qua radio — “Alpha, report!” ai cũng biết là gọi team Alpha báo cáo. Một từ, ngay lập tức.
- Tên gọi riêng trigger hành động — trong nhà, nghe “anh ơi” là phản xạ tự quay lại. Không cần mô tả chi tiết bạn muốn gì.
- Hotkey binding — Ctrl+R là reload. Không ai type “please refresh the browser tab” mỗi lần.
- Speed dial công ty — không cần nhớ số extension của IT support, nhấn một nút là xong.
- “Say less” — nói một từ người kia hiểu cả đoạn. Không cần giải thích.
Khi nào dùng
Dùng Commands cho shortcuts thực sự ngắn gọn — một vài dòng instruction. Nếu workflow phức tạp hơn, migrate lên Skills.
4. Hooks — Kích Hoạt Tự Động
Nó là gì?
Hooks là scripts tự động chạy khi có sự kiện cụ thể trong Claude Code workflow. Không cần prompting, không cần nhớ invoke — chúng tự trigger.
Claude Code hỗ trợ nhiều loại events. Một số quan trọng nhất:
| Event | Khi nào trigger |
|---|---|
SessionStart | Đầu mỗi session |
PreToolUse | Trước khi Claude dùng tool (Read, Write, Bash, v.v.) |
PostToolUse | Sau khi Claude dùng tool xong |
Stop | Khi Claude kết thúc một turn |
Notification | Khi Claude gửi notification cho user |
Có 3 loại hook handler:
- command — chạy shell script, nhận JSON qua stdin
- prompt — inject thêm context vào Claude
- agent — spawn sub-agent xử lý
Config trong .claude/settings.json:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": ".claude/hooks/block-dangerous.sh" } ] } ], "PostToolUse": [ { "matcher": "Write", "hooks": [ { "type": "command", "command": ".claude/hooks/auto-lint.sh" } ] } ] }}Ví dụ thực tế — Auto-lint sau mỗi lần write
#!/bin/bashinput=$(cat)tool_name=$(echo "$input" | jq -r '.tool_name // ""')file_path=$(echo "$input" | jq -r '.tool_input.file_path // ""')
# Chỉ lint TypeScript/JavaScript filesif [[ "$file_path" =~ \.(ts|tsx|js|jsx)$ ]]; then npx eslint "$file_path" --fix --quiet 2>/dev/null echo "{\"message\": \"Linted: $file_path\"}"fi
exit 0chmod +x .claude/hooks/auto-lint.shTừ giờ mỗi lần Claude Code write một .ts file, ESLint tự chạy và fix. Bạn không cần nhớ gọi linter nữa.
Ví dụ thực tế — Chặn lệnh nguy hiểm
#!/bin/bashinput=$(cat)tool_name=$(echo "$input" | jq -r '.tool_name // ""')command=$(echo "$input" | jq -r '.tool_input.command // ""')
if [ "$tool_name" != "Bash" ]; then exit 0fi
# Chặn xóa file production dataif echo "$command" | grep -qE 'DROP TABLE|TRUNCATE|DELETE FROM.*WHERE.*1=1'; then echo '{"error": "BLOCKED: Lệnh nguy hiểm với database. Review thủ công."}' >&2 exit 2fi
# Chặn force pushif echo "$command" | grep -qE 'git push.*(-f|--force)'; then echo '{"error": "BLOCKED: Force push không được phép trong project này."}' >&2 exit 2fi
exit 0Exit code 2 = block và show error. Exit code 0 = cho phép tiếp tục.
5 Analogies
- Bẫy mìn và dây trip — không cần ai kéo cò. Ai đạp vào dây là nổ. Hooks hoạt động y chang — không cần trigger thủ công.
- Thói quen tự động — bạn luôn hôn goodbye trước khi ra cửa mà không cần nghĩ. Sau đủ lần lặp lại, hành vi trở thành automatic.
- Passive ability auto-trigger — trong MOBA, passive “khi HP xuống dưới 20%, tự heal” không cần bạn activate. Hooks tương tự: điều kiện đúng, tự chạy.
- Automated workflow trong Jira — ticket chuyển sang “Done” là email tự gửi cho stakeholder. Không ai ngồi canh.
- Auto-reply và read receipts — một số app tự send “Seen” và tự reply template. Không cần suy nghĩ, hệ thống tự lo.
Khi nào dùng
Hooks là vũ khí bí mật của power users. Nếu bạn có một việc phải làm mỗi lần sau một action nào đó — auto-lint, auto-test, log audit, chặn lệnh nguy hiểm — hooks là câu trả lời.
Lỗi hay gặp
- Quên
chmod +xcho hook script — hook script không executable sẽ silently fail - Hook chạy quá lâu blocking workflow — đặt timeout hoặc chạy async
- Không test hook trước khi commit — một hook lỗi có thể block mọi tool use
5. Agents — Nhân Viên Phụ
Nó là gì?
Agents là sub-Claude instances với role riêng, rules riêng, và thậm chí tool restrictions riêng. Claude chính có thể spawn agents để làm việc song song hoặc xử lý tasks cụ thể.
Agents sống ở:
.claude/agents/— agents chỉ dùng cho project này~/.claude/agents/— agents dùng được ở mọi project
Mỗi agent là một file markdown:
---name: security-reviewerdescription: "Review code để phát hiện security vulnerabilities"tools: - Read - Bash# Không có Write — agent này chỉ đọc, không sửa---
# Security Reviewer Agent
Bạn là security engineer chuyên review code cho vulnerabilities.
## Focus Areas- SQL injection- XSS vulnerabilities- Insecure direct object references- Hardcoded credentials- Missing authentication/authorization checks
## Output FormatLuôn output theo format:```json{ "severity": "high|medium|low", "file": "path/to/file.ts", "line": 42, "issue": "Mô tả vấn đề", "recommendation": "Cách fix"}Rules
- Không tự sửa code, chỉ report
- Nếu không chắc chắn, đánh dấu là “needs-review” thay vì false positive
- Luôn cite specific line numbers
Quan trọng: **agents không thể spawn thêm agents khác**. Chỉ có Claude chính mới có thể spawn agents.
### Ví dụ thực tế — Workflow song song
Thay vì làm tuần tự:1. Review code → chờ → fix → chờ → test
Dùng agents để làm song song:Claude chính: ├── Spawn security-reviewer → review parallel ├── Spawn performance-checker → analyze parallel └── Spawn test-generator → generate tests parallel
Khi tất cả xong: tổng hợp kết quả, apply fixes
### 5 Analogies
- **Lính đặc nhiệm từng vai** — một nhóm có sniper, medic, sapper, intel officer. Mỗi người một chuyên môn, phối hợp cùng nhau hoàn thành mission mà một mình không làm được.- **Wingman/wingwoman** — họ đi cùng hỗ trợ, tạo điều kiện thuận lợi, nhưng không thay bạn tán. Claude chính là người tán, agents là wingmen.- **Party members trong RPG** — healer lo máu, tank lo damage, DPS lo damage output. Mỗi người có skill tree khác nhau, phối hợp là win.- **Chuyên gia biệt phái từ phòng khác** — mượn người từ phòng security, phòng data, phòng infrastructure để làm project. Xong việc trả người về.- **Roles trong group chat** — "người lên plan" tổng hợp ý kiến, "người hype" giữ energy, "người reality check" giữ realistic. Mỗi role khác nhau, nhóm mạnh hơn.
### Khi nào dùng
Dùng agents khi:- Task cần role rất cụ thể với tool restrictions khác nhau (ví dụ: reviewer chỉ cần Read, không cần Write)- Muốn chạy song song để tiết kiệm thời gian- Muốn isolate context giữa các subtasks để tránh context pollution
### Lỗi hay gặp
- Tạo agent quá generic — "helpful assistant" không phải agent, đó là Claude mặc định- Cho agent quá nhiều tools — nếu reviewer không cần Write, đừng cho Write- Quên rằng agents không thể spawn agents khác — design workflow accordingly
---
## 6. Plugins — Gói Cài Đặt
### Nó là gì?
Plugins là bundle đóng gói nhiều components lại với nhau để dễ chia sẻ và cài đặt. Một plugin có thể chứa: skills, commands, agents, hooks, MCP servers, LSP configs, và settings.
Cấu trúc plugin:my-plugin/ ├── plugin.json ← Manifest (bắt buộc) ├── skills/ │ └── my-skill/ │ └── SKILL.md ├── agents/ │ └── my-agent.md ├── hooks/ │ └── my-hook.sh └── settings.json ← Default settings cho plugin
`plugin.json`:
```json{ "name": "shopee-dev-tools", "version": "1.2.0", "description": "Tools cho Shopee backend developers", "author": "platform-team@shopee.com", "skills": ["skills/"], "agents": ["agents/"], "hooks": { "config": "settings.json" }, "namespace": "shopee"}Cài đặt:
claude plugin install ./shopee-dev-tools# hoặc từ registryclaude plugin install @shopee/dev-toolsSau khi cài, skills và commands được namespace:
/shopee:create-migration/shopee:review-pr/shopee:deploy-stagingNamespace tránh conflict khi cài nhiều plugins cùng lúc.
Ví dụ thực tế — Plugin cho team
Giả sử team FPT Software có platform team build plugin cho tất cả backend developers:
fpt-backend-tools/├── plugin.json├── skills/│ ├── create-service/ ← Tạo microservice mới đúng template│ │ └── SKILL.md│ ├── deploy-staging/ ← Deploy lên staging environment│ │ └── SKILL.md│ └── generate-docs/ ← Gen API docs từ code│ └── SKILL.md├── agents/│ ├── security-reviewer.md│ └── performance-checker.md└── hooks/ ├── pre-commit-lint.sh └── auto-log-changes.shDeveloper mới join: claude plugin install @fpt/backend-tools — có ngay toàn bộ setup mà không cần đọc hàng chục trang onboarding docs.
5 Analogies
- Kit nhiệm vụ hoàn chỉnh — không phải chỉ súng. Đạn, thuốc men, bản đồ, radio, ration — mọi thứ đóng gói sẵn cho một loại mission cụ thể.
- Date trọn gói — không phải “mình đi ăn nhé”. Đã book nhà hàng, mua hoa, chọn playlist, đặt taxi. Một quyết định, mọi thứ được xử lý.
- DLC expansion pack — không phải một item. Cả map mới, nhân vật mới, storyline mới, soundtrack mới. Cài một lần, unlock cả ecosystem.
- Enterprise software suite — Atlassian một cái là có Jira + Confluence + Bitbucket + Trello tích hợp. Không phải mua từng cái rồi tự config.
- App cài một cái dùng luôn — không cần đọc manual, không cần config 30 phút. Cài xong mở lên dùng được ngay.
Khi nào dùng
Plugins phù hợp khi bạn muốn chia sẻ setup với team hoặc community. Nếu chỉ dùng cho project cá nhân, skills và agents riêng lẻ là đủ.
7. Permissions — Bộ Lọc Truy Cập File
Nó là gì?
Permissions cho phép bạn kiểm soát file và thư mục nào Claude Code được phép đọc hoặc ghi.
Lưu ý quan trọng: Nhiều người tìm kiếm .claudeignore — file này không phải tính năng chính thức của Claude Code. Đừng dùng nó và kỳ vọng nó hoạt động.
Cách đúng là dùng permissions trong .claude/settings.json:
{ "permissions": { "deny": [ "Read(.env)", "Read(.env.*)", "Read(secrets/**)", "Read(**/*.pem)", "Read(**/*.key)", "Write(k8s/production/**)", "Write(db/migrations/applied/**)" ] }}Syntax: Action(pattern) trong đó:
Action:Read,Write,Execute(hoặcBash)pattern: glob pattern
Claude Code cũng tự động respect .gitignore theo mặc định (respectGitignore: true). Files trong .gitignore sẽ không được đọc trừ khi bạn explicitly cho phép.
Để tắt gitignore integration:
{ "respectGitignore": false}Ví dụ thực tế — Project banking app
{ "permissions": { "deny": [ "Read(.env)", "Read(.env.production)", "Read(config/secrets.yml)", "Read(src/main/resources/application-prod.yml)", "Write(src/main/resources/application-prod.yml)", "Bash(rm **)", "Bash(curl ** | bash **)" ] }, "respectGitignore": true}5 Analogies
- Hồ sơ mật phân cấp — bạn có clearance level gì thì đọc được file đó. Không có clearance, cái tủ hồ sơ đó không tồn tại với bạn.
- Chủ đề cấm kỵ trong relationship — “ĐỪNG BAO GIỜ nhắc đến chuyện đó.” Rõ ràng, không bàn cãi, không exception.
- Locked inventory slots — chưa đủ level hoặc chưa có key thì slot đó khóa. Nhìn thấy icon nhưng không dùng được.
- Access control policy của công ty — intern không xem được salary sheet, junior không deploy lên production, chỉ senior có thể merge vào main.
- Block list, no cap — block là block. Không “maybe”, không “nếu như”. File trong deny list là không có chuyện đọc.
Khi nào dùng
Luôn setup permissions cho production-sensitive files ngay từ đầu. Đừng đợi đến khi có incident mới nhớ ra.
Cách Chúng Hoạt Động Cùng Nhau
Đây là điểm mà mọi thứ thực sự click. Các components không phải independent silos — chúng tạo thành một ecosystem.
Scenario thực tế: Feature deployment workflow
Giả sử bạn đang build tính năng mới cho app VNPay. Đây là cách workflow hoạt động:
1. Khởi đầu session — CLAUDE.md tự load, Claude biết ngay: stack là Spring Boot + Kafka, convention là snake_case, business logic không được nằm trong controllers, không commit thẳng vào main.
2. Bạn gọi skill — “tạo migration cho bảng payment_methods” → /create-migration skill tự động:
- Tìm migration số mới nhất
- Tạo file với đúng naming convention
- Thêm comment header chuẩn
- Tạo rollback file
- Update migration log
3. Hook auto-trigger — sau khi write file migration, PostToolUse hook chạy:
- Validate SQL syntax
- Check không có
DROP TABLEnguy hiểm - Log action vào audit trail
4. Claude spawn agent — để review code song song, Claude spawn security-reviewer agent:
- Agent chỉ có Read permission
- Review migration file tìm SQL injection patterns
- Return report không làm gián đoạn main workflow
5. Permissions bảo vệ — khi Claude cố write vào k8s/production/, permissions.deny block lại ngay lập tức.
CLAUDE.md (context) + Skills (workflow) + Hooks (automation) + Agents (parallel work) + Permissions (safety) = Powerful, safe, consistent development workflow[IMAGE: Diagram showing data flow between CLAUDE.md → Skills/Commands → Hooks → Agents with Permissions as a security layer overlay]
Cheat Sheet Nhanh
| Component | File/Location | Invoke | Best For |
|---|---|---|---|
| CLAUDE.md | ./CLAUDE.md hoặc ~/.claude/CLAUDE.md | Tự động | Project context, conventions, rules |
| Skills | .claude/skills/<name>/SKILL.md | Nói tự nhiên hoặc /skill-name | Complex workflows tái sử dụng |
| Commands | .claude/commands/<name>.md | /command-name | Quick shortcuts (legacy) |
| Hooks | Config trong settings.json | Tự động khi event | Automation, safety checks, logging |
| Agents | .claude/agents/<name>.md | Claude spawn via Task tool | Parallel work, specialized roles |
| Plugins | .claude-plugin/plugin.json | claude plugin install | Chia sẻ setup với team/community |
| Permissions | settings.json → permissions.deny | Tự động block | Bảo vệ sensitive files |
FAQ
Q: CLAUDE.md ở root project và trong .claude/ khác gì nhau?
Root CLAUDE.md được commit vào git và shared với team. .claude/CLAUDE.md thường được gitignore và chứa personal preferences của bạn. Dùng root CLAUDE.md cho team conventions, dùng .claude/CLAUDE.md cho personal workflow của riêng bạn.
Q: Skills và Commands — tôi nên dùng cái nào khi bắt đầu?
Nếu bạn mới bắt đầu, học Skills luôn đi. Commands là legacy và Skills hoàn toàn replace được. Skills có structure rõ ràng hơn, flexible hơn, và là direction mà Claude Code đang đi.
Q: Agents có tốn thêm cost không?
Có — mỗi agent là một Claude API call riêng. Nhưng vì chúng chạy song song, tổng thời gian thực thi ngắn hơn nhiều. Và vì mỗi agent có focused context (không phải full project context), mỗi call thường cheaper hơn.
Q: Tôi có thể có bao nhiêu Hooks?
Không có giới hạn cứng. Nhưng thực tế: càng nhiều hooks, mỗi tool use càng chậm. Audit hooks thường xuyên, remove những cái không còn cần thiết. Tôi thường giữ dưới 5 hooks active cùng lúc.
Q: Plugin registry có không? Tôi có thể install plugin của người khác không?
Có một community registry đang hình thành, nhưng còn khá early. Phần lớn plugins tốt nhất hiện tại là internal tools của các team hoặc được share qua GitHub. Tìm với keyword “claude code plugin” trên GitHub.
Q: Permissions deny có block được hoàn toàn không? Claude Code có cách bypass không?
Permissions được enforce ở application level — Claude Code không thể đọc file trong deny list ngay cả khi bạn explicitly yêu cầu trong prompt. Đây là hard block, không phải soft suggestion. Tuy nhiên, đừng dựa vào permissions là tầng bảo mật duy nhất — defense in depth vẫn là best practice.
Q: Tôi có nên đặt CLAUDE.md vào .gitignore không?
Không — trừ phi nó chứa sensitive info (which it shouldn’t). CLAUDE.md nên được commit và shared với team. Đó là điểm mấu chốt: mọi người trong team đều benefit từ project context. Nếu bạn có personal preferences, đặt chúng trong .claude/CLAUDE.md và gitignore cái đó.
Kết Luận
Một lần nữa, tóm tắt để nhớ:
- CLAUDE.md — context và rules, tự động load, shared với team
- Skills — complex workflows tái sử dụng, invoke tự nhiên
- Commands — shortcuts nhanh (legacy, đang migrate sang Skills)
- Hooks — automation tự động dựa trên events
- Agents — sub-Claude với role riêng, chạy song song
- Plugins — bundle mọi thứ để share
- Permissions — safety net cho sensitive files
Tôi suggest thứ tự học: CLAUDE.md trước (impact lớn nhất, dễ nhất), rồi Hooks (power users ngay lập tức), rồi Skills khi bạn nhận ra mình đang describe cùng một workflow 3 lần, rồi Agents khi project đủ lớn cần parallel work.
Plugins và Commands là nice-to-have, không phải must-have ngay từ đầu.
Có component nào bạn đang dùng theo cách khác, hoặc có trick hay muốn chia sẻ? Comment bên dưới hoặc tìm tôi trên Twitter/X.
Đọc tiếp:
- Claude Code Hooks: Tính Năng Mạnh Mẽ Mà Ít Ai Biết — deep dive vào Hooks
- Tại Sao CLAUDE.md Là File Quan Trọng Nhất — CLAUDE.md strategy chi tiết
- 5 Lỗi Claude Code Mà Developer Nào Cũng Mắc — avoid common pitfalls