> ## Documentation Index
> Fetch the complete documentation index at: https://huongdan.luklak.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Bài 3 — Công cụ & Vòng lặp thực thi

> Phép màu không nằm ở AI — nằm ở AI cộng quyền truy cập file. Đi sâu vào từng công cụ Claude Code dùng.

**Điểm cốt lõi của bài này**

<Check>
  Phép màu của Claude Code không nằm ở AI. Nằm ở AI **cộng quyền truy cập file hệ thống**. Khi LLM có thể đọc, ghi, chạy lệnh — nó không chỉ trả lời, mà thực sự làm việc.
</Check>

## Mở đầu

Nếu Bài 2 đã giải thích Claude Code LÀ gì, bài này giải thích nó LÀM gì — cụ thể từng bước.

Một chatbot bình thường chỉ biết trả lời. Claude Code đọc file của bạn, sửa từng dòng, chạy lệnh terminal, commit lên Git. Sự khác biệt nằm ở bộ **công cụ (tool)** và **vòng lặp (loop)** điều phối chúng.

## Các công cụ chính

<CardGroup cols={2}>
  <Card title="Read" icon="file-lines" iconType="duotone">
    Đọc nội dung bất kỳ file nào. Dùng khi: cần hiểu code/doc trước khi sửa.
  </Card>

  <Card title="Write" icon="file-plus" iconType="duotone">
    Tạo file mới. Dùng khi: tạo bài viết, component, file config mới.
  </Card>

  <Card title="Edit" icon="pen-to-square" iconType="duotone">
    Sửa một phần nhỏ trong file có sẵn. Dùng khi: fix bug, thêm câu, đổi giá trị.
  </Card>

  <Card title="Bash" icon="terminal" iconType="duotone">
    Chạy lệnh terminal. Dùng khi: git commit, chạy test, chạy build.
  </Card>

  <Card title="Grep" icon="magnifying-glass" iconType="duotone">
    Tìm chuỗi ký tự trong nhiều file. Dùng khi: "cái biến `foo` được dùng ở đâu?"
  </Card>

  <Card title="Glob" icon="folder-tree" iconType="duotone">
    Tìm file theo pattern. Dùng khi: "tất cả file .mdx trong thư mục vi/".
  </Card>

  <Card title="WebFetch" icon="globe" iconType="duotone">
    Tải nội dung URL. Dùng khi: cần tham khảo tài liệu online.
  </Card>

  <Card title="Agent" icon="users" iconType="duotone">
    Gọi **sub-agent (agent con)**. Dùng khi: cần chuyên gia riêng cho task phụ.
  </Card>
</CardGroup>

## Dịch một trang là gì? — Nhìn dưới dạng chuỗi tool call

```mermaid theme={null}
sequenceDiagram
    actor Bạn
    participant Claude as Claude Code
    participant File as Hệ thống file
    Bạn->>Claude: Dịch file X.mdx sang tiếng Việt
    Claude->>File: Read X.mdx (tiếng Anh)
    File-->>Claude: Nội dung EN
    Claude->>File: Read mẫu VI để bắt giọng
    File-->>Claude: Nội dung mẫu
    Claude->>Claude: Dịch + kiểm tra thuật ngữ
    Claude->>File: Write X.mdx mới (tiếng Việt)
    File-->>Claude: OK
    Claude->>Bạn: Đã tạo file mới, kiểm tra giúp
```

Một yêu cầu đơn giản về phía bạn — "dịch file này" — thực tế là một chuỗi hành động có trật tự phía Claude. Mỗi mũi tên là một lượt gọi **công cụ (tool call)**, và mỗi lượt đều trả về dữ liệu để Claude dùng cho bước tiếp theo.

## Ví dụ thực từ dự án Luklak

<Tabs>
  <Tab title="User prompt">
    ```
    Dịch file EN LAIKA CRM sang tiếng Việt theo chuẩn Lulu.
    ```

    Một câu. Không chỉ định file đích, không chỉ định thư mục đầu ra. Claude phải tự tra cứu quy ước của dự án.
  </Tab>

  <Tab title="Claude thao tác">
    Các lượt tool call thực tế trong phiên làm việc:

    * `Read en/03-build/.../laika-crm1.mdx` — đọc bản gốc tiếng Anh
    * `Read Lulu/02-skills/skill-translate-en-to-vi.md` — nạp hướng dẫn dịch nội bộ
    * `Read vi/...` — đọc một file VI đã dịch trước đó làm mẫu giọng văn
    * `Write vi/03-build/case-study-laika/chuc-nang/crm.mdx` — tạo bản dịch 275 dòng
    * `Bash: git add ... && git commit -m "..." && git push` — đóng gói và đẩy lên repo

    Tổng cộng khoảng 8–10 tool call cho một prompt đơn.
  </Tab>

  <Tab title="Kết quả">
    Claude trả lời lại bằng một đoạn báo cáo ngắn:

    > Đã tạo file 275 dòng tại `vi/03-build/case-study-laika/chuc-nang/crm.mdx`.
    > Đã commit và push lên repo.
    > URL live: `huongdan.luklak.com/03-build/case-study-laika/chuc-nang/crm`.
    > Kiểm tra giúp mình nhé.

    Không có gì "sáng tạo" ở đây. Chỉ là: đọc — hiểu — viết — lưu — báo cáo.
  </Tab>
</Tabs>

## Vòng lặp thực thi chi tiết

```mermaid theme={null}
flowchart TD
    A[User prompt] --> B[LLM phân tích<br/>ý định]
    B --> C[Chọn tool]
    C --> D[Gọi tool]
    D --> E[Nhận kết quả]
    E --> F{Đã đủ thông tin<br/>để xong task?}
    F -->|Chưa| C
    F -->|Rồi| G[Tổng hợp<br/>báo cáo]
    G --> H[Trả lời user]
    style A fill:#e3f2fd
    style H fill:#c8e6c9
```

Đây là cốt lõi khác biệt giữa chatbot và agent. Chatbot dừng ngay sau khi sinh xong câu trả lời đầu tiên. Claude Code **lặp**: chọn tool → gọi tool → nhận kết quả → hỏi chính nó *"đã đủ chưa?"* → nếu chưa, chọn tool tiếp theo.

Một task phức tạp có thể gọi **10–50 tool call**. Mỗi lượt là một bước quan sát thế giới (đọc file, chạy lệnh) rồi tác động lên thế giới (ghi file, commit). Bạn không thấy vòng lặp này vì Claude chỉ báo cáo lại khi mọi việc đã xong.

## Khoảnh khắc "aha"

<Info>
  Khoảnh khắc người mới dùng Claude Code hiểu ra sự khác biệt là khi họ thấy: *"Ồ, nó không trả lời câu hỏi của mình. Nó thực sự sửa file. Nó thực sự push lên GitHub."*

  Đó là lúc mô hình tư duy chuyển từ "AI là cỗ máy trò chuyện" sang "AI là nhân sự có quyền truy cập hệ thống". Hai thứ hoàn toàn khác nhau về giá trị kinh doanh.
</Info>

## Tự kiểm tra

<AccordionGroup>
  <Accordion title="Câu 1: Khi tôi yêu cầu 'đếm số file .mdx trong thư mục vi/', Claude dùng tool gì?" icon="circle-question">
    **Glob** để tìm tất cả file khớp pattern `vi/**/*.mdx`, sau đó đếm số kết quả trả về. Với các tác vụ tìm theo tên file, Glob nhanh và chính xác hơn Bash `ls`. Nếu cần tìm theo **nội dung** file thay vì tên, Claude sẽ chọn Grep.
  </Accordion>

  <Accordion title="Câu 2: Claude Code có chạy lệnh `rm -rf /` được không?" icon="circle-question">
    Về mặt kỹ thuật có — tool Bash cho phép chạy bất kỳ lệnh shell nào. Nhưng Claude Code **hỏi xác nhận** trước các lệnh nguy hiểm, và bạn có thể cấu hình danh sách lệnh cho phép hoặc cấm trong `settings.json`. Nguyên tắc nền tảng: **bạn luôn là người duyệt cuối**. Agent đề xuất, con người phê duyệt.
  </Accordion>

  <Accordion title="Câu 3: Một prompt có thể gọi bao nhiêu tool?" icon="circle-question">
    Không có giới hạn cứng — từ 1 đến hàng trăm tool call tùy độ phức tạp của task. Một câu chào hỏi có thể 0 tool. Một yêu cầu "refactor toàn bộ module" có thể hàng trăm tool. Giới hạn thực tế là **cửa sổ ngữ cảnh (context window)** — khi quá nhiều kết quả tool chất đầy bàn làm việc, Claude Code sẽ nén bớt hoặc giao việc cho sub-agent.
  </Accordion>
</AccordionGroup>

## Bài tập

<Steps>
  <Step title="Mở VS Code với dự án Mintlify">
    Dự án `mintlify-tailieuvn` hoặc dự án Mintlify bất kỳ của bạn. Mở terminal Claude Code trong VS Code.
  </Step>

  <Step title="Thử một yêu cầu cần Glob">
    Gõ: *"Đếm số file .mdx trong thư mục 06-academy/."*

    Quan sát: tool Glob được gọi với pattern `06-academy/**/*.mdx`, kết quả trả về danh sách file, Claude tổng hợp thành một con số.
  </Step>

  <Step title="Thử một yêu cầu cần Read rồi Edit">
    Gõ: *"Thêm một dòng comment vào cuối file 06-academy/index.mdx: 'Cập nhật ngày \[hôm nay]'."*

    Quan sát: tool Read được gọi trước (đọc toàn bộ file để biết cấu trúc), rồi tool Edit được gọi (chèn dòng mới vào cuối). Chú ý thứ tự: không bao giờ sửa trước khi đọc.
  </Step>

  <Step title="Kiểm tra file thật sự đã đổi">
    Mở file `06-academy/index.mdx` bằng chính VS Code. Xem dòng comment mới đã xuất hiện ở cuối chưa.

    Nếu có: bạn vừa chứng kiến phép màu — AI đã thực sự chạm vào file hệ thống của bạn.
  </Step>
</Steps>

## Tiếp theo?

* [Bài 4 — Sub-agent & Đội hình](/06-academy/claude-code/sub-agent-va-doi-hinh)
* [Quay lại Bài 2](/06-academy/claude-code/claude-code-la-gi)
