Tôi đã đọc mã nguồn của Claude Code để bạn không cần phải làm điều đó

@mal_shaik
TIẾNG ANH4 tháng trước · 31 thg 3, 2026
1.7M
2.3K
334
54
6.0K

TL;DR

Bài viết này phân tích kiến trúc nội bộ của CLI Claude Code từ Anthropic, tiết lộ cách tối ưu hóa CLAUDE.md, sử dụng các subagent song song miễn phí và tự động hóa quy trình làm việc với các custom hook.

Hầu hết mọi người mở Claude Code, gõ một prompt, chờ phản hồi, rồi lại gõ prompt tiếp theo.

Điều đó giống như mua một chiếc Ferrari và chỉ chạy ở số 1.

Tôi muốn hiểu tại sao một số người có thể tận dụng Claude Code hiệu quả gấp 10 lần những người khác. Vậy nên tôi đã làm điều mà bất kỳ người hợp lý nào cũng sẽ làm: đọc toàn bộ mã nguồn (khi tôi nói "tôi", tất nhiên là ý nói Claude Code).

11 lớp kiến trúc. Hàng nghìn dòng mã. Một nền tảng điều phối tác nhân đội lốt một trình chat trong terminal.

Đây là những gì mã nguồn tiết lộ về cách thực sự sử dụng công cụ này.

1. CLAUDE.md được tải mỗi lượt xử lý. Mỗi. Một. Lượt.

Đây là việc có tác động lớn nhất bạn có thể làm và gần như không ai làm đúng.

Hầu hết mọi người hoặc không có gì trong tệp CLAUDE.md, hoặc viết cả một cuốn sách vào đó.

Mã nguồn cho thấy Claude Code đọc tệp CLAUDE.md của bạn trong MỖI lần truy vấn. Không phải lúc bắt đầu phiên. Mỗi lượt. Điều đó có nghĩa là mỗi khi bạn gửi tin nhắn, nó đọc lại hướng dẫn của bạn.

Có cả một hệ thống phân cấp:

  • ~/.claude/CLAUDE.md — toàn cục (phong cách viết mã, sở thích của bạn)
  • ./CLAUDE.md — cấp dự án (quyết định kiến trúc, quy ước)
  • .claude/rules/*.md — quy tắc mô-đun
  • CLAUDE.local.md — ghi chú cá nhân (được gitignore)

Bạn có 40.000 ký tự. Đó là RẤT NHIỀU. Hầu hết mọi người chỉ dùng khoảng 200.

Hãy đặt các quyết định kiến trúc vào đó. Quy ước tệp tin. Mẫu kiểm thử. Các quy tắc "không bao giờ làm điều này". Mô hình đọc chúng mỗi lượt. Đây là sự khác biệt giữa Claude Code là một trợ lý chung chung và Claude Code là trợ lý RIÊNG của bạn, hiểu codebase của bạn.

Nếu bạn chỉ làm một việc sau khi đọc bài này, thì hãy làm việc này.

2. Các tác nhân con chia sẻ bộ nhớ đệm prompt (xử lý song song gần như miễn phí)

Đây là điều khiến tôi kinh ngạc.

Khi Claude Code tạo một tác nhân con, nó tạo một bản sao byte-giống hệt của ngữ cảnh cha. API lưu cache này. Vì vậy, việc sinh ra 5 tác nhân để làm việc trên các phần khác nhau của codebase gần như không tốn thêm chi phí so với 1 tác nhân làm tuần tự.

Đọc lại điều đó.

5 tác nhân. Chi phí tương đương 1. Bởi vì tất cả đều dùng chung bộ nhớ đệm prompt.

Hầu hết mọi người sử dụng Claude Code như một worker đơn lẻ. Một tác vụ mỗi lần. Chờ nó hoàn thành. Rồi giao nhiệm vụ tiếp theo.

Mã nguồn thực sự có ba mô hình thực thi cho các tác nhân con:

  • fork — kế thừa ngữ cảnh cha, tối ưu bộ nhớ đệm
  • teammate — panel riêng trong tmux hoặc iTerm, giao tiếp qua hộp thư dựa trên tệp
  • worktree — có git worktree riêng, nhánh cô lập cho mỗi tác nhân

Bạn có thể yêu cầu Claude Code tạo 5 tác nhân: một tác nhân kiểm tra bảo mật, một tác nhân tái cấu trúc module xác thực, một tác nhân viết test, một tác nhân cập nhật tài liệu, một tác nhân sửa lỗi. Tất cả cùng một lúc. Tất cả chia sẻ bộ nhớ đệm.

Kiến trúc được XÂY DỰNG cho việc này. Sử dụng nó đơn luồng thật là một tội ác.

3. Hệ thống quyền được thiết kế để cấu hình, không phải để click qua

Mỗi khi Claude Code hỏi "cho phép hành động này?" và bạn click "có", đó là sự thất bại của cấu hình, không phải là một tính năng.

Mã nguồn tiết lộ một thác cài đặt 5 cấp:

text
1policy > flag > local > project > user

Trong ~/.claude/settings.json, bạn có thể đặt các mẫu glob cho những gì luôn được phép:

json
1{
2 "permissions": {
3 "allow": [
4 "Bash(npm *)",
5 "Bash(git *)",
6 "Edit(src/**)",
7 "Write(src/**)"
8 ]
9 }
10}

Có ba chế độ quyền:

  • bypass — không kiểm tra quyền gì cả (nguy hiểm nhưng nhanh)
  • allowEdits — tự động cho phép chỉnh sửa tệp trong thư mục làm việc
  • auto (mới) — chạy một bộ phân loại LLM trên mỗi hành động. Đây là điểm ngọt ngào.

Chế độ auto có danh sách cho phép/từ chối riêng mà bạn có thể cấu hình. Mã nguồn cho thấy nó chạy đồng thời nhiều bộ giải quyết: click người dùng, bộ phân loại hook, cầu nối, và cái nào phản hồi trước thì thắng.

Mỗi lần bạn dừng lại để click "cho phép" là thời gian lãng phí. Cấu hình một lần. Không bao giờ click lại.

4. Có 5 chiến lược nén. Áp lực ngữ cảnh là một vấn đề thực sự

Mã nguồn có NĂM cách khác nhau để nén cuộc hội thoại khi nó quá dài:

  1. microcompact — xóa kết quả công cụ cũ dựa trên thời gian
  1. context collapse — tóm tắt các đoạn hội thoại
  1. session memory — trích xuất ngữ cảnh chính vào một tệp
  1. full compact — tóm tắt toàn bộ lịch sử
  1. PTL truncation — xóa các nhóm tin nhắn cũ nhất

Điều này cho bạn biết một điều quan trọng: tràn ngữ cảnh là một vấn đề trung tâm mà các kỹ sư đã dành RẤT NHIỀU thời gian.

Điều này có nghĩa gì với bạn:

  • Hãy sử dụng /compact một cách chủ động. Đừng chờ hệ thống tự động nén và mất ngữ cảnh bạn quan tâm.
  • Cửa sổ mặc định là 200K token. Nhưng bạn có thể chọn 1M token bằng cách sử dụng hậu tố mô hình [1m]. Đối với các tái cấu trúc lớn xuyên suốt nhiều tệp, điều này rất quan trọng.
  • Các phiên dài tích lũy "session memory" — các bản tóm tắt có cấu trúc về thông số kỹ thuật tác vụ, danh sách tệp, trạng thái quy trình làm việc, lỗi và bài học. Đây là lý do tại sao tiếp tục một phiên tốt hơn là bắt đầu mới.
  • Kết quả công cụ lớn được lưu vào đĩa với chỉ bản xem trước 8KB được gửi đến mô hình. Nếu bạn dán một tệp khổng lồ, mô hình có thể chỉ thấy một phần nhỏ. Giữ đầu vào tập trung.

Những người tận dụng tối đa Claude Code sử dụng /compact như một điểm lưu thủ công trong trò chơi điện tử. Giữ lại những gì quan trọng, xóa những gì không cần, và tiếp tục.

5. Hệ thống hook là API mở rộng thực sự (25+ sự kiện vòng đời)

Đây là tính năng dành cho người dùng cao cấp mà hầu như không ai biết đến.

Mã nguồn tiết lộ hơn 25 sự kiện vòng đời mà bạn có thể hook vào:

  • PreToolUse — chạy trước khi bất kỳ công cụ nào thực thi
  • PostToolUse — chạy sau khi bất kỳ công cụ nào thực thi
  • UserPromptSubmit — chạy khi bạn gửi tin nhắn
  • SessionStart / SessionEnd — vòng đời phiên
  • và hơn 20 sự kiện nữa

Với 5 loại hook:

  • command — chạy một lệnh shell
  • prompt — tiêm ngữ cảnh qua LLM
  • agent — chạy một vòng lặp xác minh tác nhân đầy đủ
  • HTTP — gọi một webhook
  • function — chạy JS

Ví dụ thực tế về những gì bạn có thể làm:

  • Tự động chạy linting trước mỗi lần ghi tệp
  • Chạy test sau mỗi lần chỉnh sửa
  • Tự động tiêm tài liệu liên quan vào mỗi prompt
  • Gửi thông báo Slack khi một tác vụ hoàn thành
  • Xác thực các mẫu bảo mật được tuân thủ trước khi code được gửi đi

Hook UserPromptSubmit đặc biệt điên rồ. Bạn có thể tiêm additionalContext vào mọi tin nhắn bạn gửi. Hãy tưởng tượng tự động đính kèm đầu ra test, git diffs gần đây, hoặc trạng thái dự án vào mỗi prompt mà không cần gõ.

Đây là cách bạn xây dựng một môi trường phát triển tùy chỉnh dựa trên Claude Code. Không phải bằng cách prompt tốt hơn. Mà bằng cách hook vào chính hệ thống.

6. Các phiên làm việc có tính liên tục và có thể tiếp tục (đừng bắt đầu lại từ đầu)

Mỗi cuộc hội thoại được lưu dưới dạng JSONL tại

text
1~/.claude/projects/{hash}/{sessionId}.jsonl

Mã nguồn hỗ trợ:

  • --continue — tiếp tục phiên cuối cùng của bạn
  • --resume — chọn một phiên cụ thể trong quá khứ
  • --fork-session — rẽ nhánh từ một cuộc hội thoại trước đó (cá nhân tôi rất thích điều này)

Trích xuất bộ nhớ phiên bảo tồn ngữ cảnh chính qua các lần nén: thông số tác vụ, danh sách tệp, trạng thái quy trình làm việc, lỗi và bài học.

Hầu hết mọi người bắt đầu một phiên mới mỗi khi họ mở Claude Code. Điều này giống như đóng IDE của bạn và mở lại từ đầu mỗi giờ. Tất cả ngữ cảnh về những gì bạn đang làm, cái gì đã thất bại, cái gì bạn đã học — đều biến mất.

Hãy sử dụng --continue. Luôn luôn. Để ngữ cảnh tích lũy. Để bộ nhớ phiên xây dựng các bài học theo thời gian. Mã nguồn thực sự có cơ sở hạ tầng cho việc này. Hãy sử dụng nó.

7. Hệ thống công cụ chạy hơn 60 công cụ với xử lý theo lô thông minh

Claude Code có hơn 60 công cụ tích hợp. Nhưng phần thú vị là CÁCH nó chạy chúng.

Mã nguồn phân chia các lời gọi công cụ thành hai loại:

  • concurrent — các thao tác chỉ đọc (đọc tệp, tìm kiếm, glob) chạy song song
  • serial — các thao tác thay đổi (chỉnh sửa, ghi, lệnh bash) chạy lần lượt

Điều này có nghĩa là khi Claude Code cần đọc 10 tệp để hiểu codebase của bạn, nó đọc tất cả 10 tệp cùng một lúc. Nhưng khi nó cần chỉnh sửa 3 tệp, nó làm từng tệp một để tránh xung đột.

Trên các công cụ tích hợp, bạn có thể kết nối các máy chủ MCP để thêm nhiều công cụ hơn. Mã nguồn sử dụng tải trì hoãn. Các công cụ MCP chỉ tải khi cần, vì vậy việc kết nối 5 máy chủ MCP không làm chậm mọi yêu cầu.

Và có ToolSearch để khám phá trì hoãn các công cụ mà tác nhân chưa biết.

Bài học thực tế: nếu quy trình làm việc của bạn liên quan đến các hệ thống bên ngoài (cơ sở dữ liệu, nhà cung cấp đám mây, CI/CD), hãy kết nối các máy chủ MCP cho chúng. Kiến trúc xử lý sự phức tạp. Bạn chỉ có thêm nhiều khả năng.

8. Kiến trúc streaming có nghĩa là ngắt giữa chừng rất rẻ

Toàn bộ pipeline sử dụng các async generator phát ra các sự kiện riêng lẻ. Nhấn Escape hủy sạch luồng hiện tại mà không mất ngữ cảnh trước đó.

Điều này có vẻ nhỏ nhưng nó thay đổi cách bạn nên sử dụng Claude Code.

Đừng chờ một phản hồi mà bạn biết là đang đi sai hướng. Hãy ngắt ngay lập tức và chuyển hướng. Mã nguồn được thiết kế cho việc này. Ngữ cảnh trước đó của bạn được bảo toàn. Phản hồi bị ngắt được loại bỏ sạch sẽ. Không có chi phí nào.

Hãy nghĩ về nó như lập trình cặp đôi. Nếu người cùng cặp của bạn bắt đầu đi sai hướng, bạn không đợi họ hoàn thành. Bạn nói "thực ra, hãy đi hướng này." Cùng một tinh thần.

9. Hệ thống thử lại phức tạp hơn bạn nghĩ

Mã nguồn tiết lộ:

  • 10 lần thử lại với exponential backoff và jitter (cơ sở 500ms)
  • Tự động làm mới token OAuth trên 401/403
  • Dự phòng mô hình: nếu Opus thất bại 3 lần với lỗi 529, nó tự động dự phòng xuống Sonnet
  • Bộ giám sát chờ 90 giây trên stream — nếu stream bị đình trệ, nó dự phòng xuống non-streaming
  • Chế độ liên tục có thử lại vô hạn với backoff tối đa 5 phút

Điều này có nghĩa là Claude Code được thiết kế để chạy liên tục. Nó xử lý các trục trặc API, giới hạn tốc độ và sự cố một cách nhẹ nhàng. Bạn không cần phải theo dõi nó. Hãy để nó chạy trong nền và quay lại để xem kết quả.

Tóm lại: các hành động có tác động cao nhất từ mã nguồn:

• Viết một CLAUDE.md thực sự → được tải mỗi lượt. 40K ký tự. Cấu hình có tác động cao nhất.

• Song song hóa với các tác nhân con → mô hình fork chia sẻ bộ nhớ đệm prompt. 5 tác nhân ≈ chi phí của 1.

• Cấu hình quyền trong settings.json → loại bỏ mệt mỏi click vĩnh viễn.

• Sử dụng /compact một cách chủ động → 5 chiến lược nén tồn tại vì áp lực ngữ cảnh là có thật.

• Thiết lập hook → hơn 25 sự kiện, 5 loại. Đây là API mở rộng thực sự.

• Luôn --continue các phiên → JSONL persistence + bộ nhớ phiên = ngữ cảnh tích lũy.

• Kết nối các máy chủ MCP → tải trì hoãn có nghĩa là không chi phí cho đến khi sử dụng.

• Ngắt tự do → async generator có nghĩa là không có chi phí cho việc chuyển hướng.

Kết luận: Claude Code là một nền tảng điều phối tác nhân khoác lớp giao diện terminal.

Những người đạt được hiệu quả gấp 10 lần từ nó không phải là người prompt giỏi hơn. Họ đã cấu hình nó. Họ đã song song hóa nó. Họ đã hook vào nó. Họ để ngữ cảnh tích lũy qua các phiên.

Mã nguồn làm cho điều này trở nên rõ ràng. Bây giờ bạn đã biết nó thực sự làm gì bên dưới mui xe.

Hãy rt nếu bạn thấy điều này hữu ích 🫶

Viết lại trong YouMind

Turn one viral article into a full content workflow

Collect the source, decode the pattern, create assets, draft the story, and distribute from one AI workspace.

Explore YouMind
Dành cho nhà sáng tạo

Biến Markdown của bạn thành bài viết 𝕏 gọn gàng

Khi bạn đăng bài viết dài của riêng mình, việc định dạng hình ảnh, bảng và khối mã cho 𝕏 rất mệt mỏi. YouMind biến cả bản nháp Markdown thành một bài viết 𝕏 gọn gàng, sẵn sàng để đăng.

Thử Markdown sang 𝕏

Thêm pattern để giải mã

Bài viết viral gần đây

Khám phá thêm bài viết viral