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.json

Một câu tóm tắt mỗi component:

ComponentVai trò
CLAUDE.mdTài liệu onboarding cho AI — đọc tự động mỗi session
SkillsKỹ năng/workflow mà bạn dạy Claude một lần, dùng mãi
CommandsShortcut ngắn gọn cho tasks hay dùng (đã merge vào Skills)
HooksScripts tự động chạy khi có sự kiện (pre/post tool use)
AgentsSub-Claude với role và rules riêng, chạy song song
PluginsBundle hoàn chỉnh đóng gói tất cả trên để chia sẻ
PermissionsBộ 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:

LevelVị tríPhạm vi
Managed policyCấu hình từ tổ chức (enterprise)Toàn công ty
User memory~/.claude/CLAUDE.mdTất cả projects của bạn
Project memory./CLAUDE.md ở rootCả project
Project local.claude/CLAUDE.mdCả project (gitignored)
Project rules.clauderulesChỉ rules, không markdown
Auto memoryClaude 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:

CLAUDE.md
@docs/conventions.md
@docs/architecture.md
@docs/security-rules.md

Và 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-pr
description: "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 issues
3. 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-migration
description: "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ó}
  1. Tạo file rollback tương ứng: db/migrations/V{number}__rollback_{description}.sql
  2. 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

.claude/commands/standup.md
File command đơn giản hơn skill nhiều:
```markdown
Tóm tắt những gì tôi đã làm hôm qua dựa vào git log:
```bash
git log --since="yesterday" --author="$(git config user.email)" --oneline

Format 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-description

Gọ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:

EventKhi nào trigger
SessionStartĐầu mỗi session
PreToolUseTrước khi Claude dùng tool (Read, Write, Bash, v.v.)
PostToolUseSau khi Claude dùng tool xong
StopKhi Claude kết thúc một turn
NotificationKhi 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

.claude/hooks/auto-lint.sh
#!/bin/bash
input=$(cat)
tool_name=$(echo "$input" | jq -r '.tool_name // ""')
file_path=$(echo "$input" | jq -r '.tool_input.file_path // ""')
# Chỉ lint TypeScript/JavaScript files
if [[ "$file_path" =~ \.(ts|tsx|js|jsx)$ ]]; then
npx eslint "$file_path" --fix --quiet 2>/dev/null
echo "{\"message\": \"Linted: $file_path\"}"
fi
exit 0
Terminal window
chmod +x .claude/hooks/auto-lint.sh

Từ 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

.claude/hooks/block-dangerous.sh
#!/bin/bash
input=$(cat)
tool_name=$(echo "$input" | jq -r '.tool_name // ""')
command=$(echo "$input" | jq -r '.tool_input.command // ""')
if [ "$tool_name" != "Bash" ]; then
exit 0
fi
# Chặn xóa file production data
if 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 2
fi
# Chặn force push
if 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 2
fi
exit 0

Exit 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 +x cho 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-reviewer
description: "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 Format
Luô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:

Terminal window
claude plugin install ./shopee-dev-tools
# hoặc từ registry
claude plugin install @shopee/dev-tools

Sau khi cài, skills và commands được namespace:

/shopee:create-migration
/shopee:review-pr
/shopee:deploy-staging

Namespace 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.sh

Developer 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ặc Bash)
  • 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 TABLE nguy 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

ComponentFile/LocationInvokeBest For
CLAUDE.md./CLAUDE.md hoặc ~/.claude/CLAUDE.mdTự độngProject context, conventions, rules
Skills.claude/skills/<name>/SKILL.mdNói tự nhiên hoặc /skill-nameComplex workflows tái sử dụng
Commands.claude/commands/<name>.md/command-nameQuick shortcuts (legacy)
HooksConfig trong settings.jsonTự động khi eventAutomation, safety checks, logging
Agents.claude/agents/<name>.mdClaude spawn via Task toolParallel work, specialized roles
Plugins.claude-plugin/plugin.jsonclaude plugin installChia sẻ setup với team/community
Permissionssettings.jsonpermissions.denyTự động blockBả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: