Tự động Review Code
Tự động Review Code
Một bản triển khai tham chiếu có sẵn tại
redline.
Các tính năng chính:
- Claude (hoặc người dùng) quyết định khi nào cần review
- Claude Code toàn quyền kiểm soát reviewer agent — nó chạy như một tiến trình nền bất đồng bộ.
- Cả hai agent đều có thể quan sát, tùy biến và giám sát chi phí ngay trên Trạm AI
- Đăng nhập cả hai agent chỉ bằng một lệnh:
redline login - Được triển khai dưới dạng một stop hook duy nhất của Claude Code, mang lại sự minh bạch và khả năng tùy biến đối với agent cùng (các) model được sử dụng
Mục tiêu đạt được
Mỗi khi Claude Code hoàn tất một phản hồi mà vẫn còn
thay đổi chưa commit, một hook sẽ tự động kích hoạt
một bản review code Codex chạy nền — không hề chặn
quy trình làm việc. Người dùng vẫn làm việc bình thường
trong lúc bản review chạy. Khi hoàn tất, Claude đọc kết quả
và trình bày các phát hiện.
Không có tiến trình nền, không daemon, không giao thức filesystem. Hook chính là trigger, còn hệ thống background task của riêng Claude Code lo phần thực thi bất đồng bộ.
Yêu cầu trước
- Một Trạm AI API key
- Claude Code
đã cài đặt (claudecó trong PATH) - Codex CLI
đã cài đặt (codexcó trong PATH) - Runtime Bun hoặc Node.js
Cấu hình Trạm AI
Cả hai agent đều route inference qua Trạm AI, nhưng mỗi agent dùng một API skin và base URL khác nhau.
Claude Code
Thiết lập các biến môi trường này trong shell profile.
(~/.zshrc, ~/.bashrc). Không sử dụng file .env
— Claude Code không đọc chúng.
Base URL là https://api.staging.tram.ai.vn — không có
hậu tố /v1. Đây là Anthropic Skin của Trạm AI,
vốn giao tiếp bằng giao thức Anthropic gốc. Việc dùng
/v1 sẽ gây ra lỗi model-not-found.
ANTHROPIC_API_KEY phải được để trống một cách rõ ràng
để ngăn Claude Code xác thực trực tiếp
với Anthropic.
Kiểm tra bằng cách chạy /status trong một phiên Claude Code.
Xem hướng dẫn tích hợp Claude Code
đầy đủ để biết chi tiết.
Codex CLI
Tạo hoặc chỉnh sửa ~/.codex/config.toml:
Sau đó thiết lập API key:
Khi chạy, truyền
-c 'model_provider="tram"' để chọn
provider Trạm AI.
Các lỗi thường gặp:
- Codex CLI không có flag
--provider— dùng-ccho mọi config override khi chạy - Mục TOML là
[model_providers.tram], không phải[provider.tram] - Codex dùng
https://api.staging.tram.ai.vn/v1(có/v1), trong khi Claude dùnghttps://api.staging.tram.ai.vn(không có/v1) — chúng dùng các protocol skin khác nhau
Xem hướng dẫn tích hợp Codex CLI đầy đủ để biết chi tiết.
Tìm hiểu Stop Hook
Claude Code có một hệ thống hook được cấu hình trong
settings.json. Hook quan trọng cho trường hợp này là
Stop — nó kích hoạt mỗi khi Claude hoàn tất một
chu kỳ phản hồi.
decision: "block" hoạt động như thế nào
- Lệnh hook chạy và xuất JSON ra stdout
- Nếu JSON chứa
"decision": "block"cùng với một
chuỗi"reason", Claude Code:- Không dừng lại — nó tiếp tục cuộc hội thoại
- Văn bản
reasonđược đưa vào context của Claude
như một thông tin mới - Claude xử lý và hành động theo đó (ví dụ,
spawn một background task theo chỉ dẫn)
- Nếu lệnh thoát với mã 0 và không có output JSON, Claude
tiếp tục bình thường (không chặn) - Nếu lệnh thoát với mã khác 0, nó được coi là một
lỗi không chặn
Đây chính là cơ chế then chốt: lệnh check dùng
decision: "block" để đưa bản tóm tắt diff stat
và các chỉ dẫn review vào context của Claude. Claude
thấy bản tóm tắt, tự đánh giá xem các thay đổi có đáng
review hay không, và nếu có thì spawn lệnh review qua
công cụ Bash của nó. Background task này hiện ngay trong
danh sách task của Claude — người dùng có thể nhìn thấy, theo dõi và hủy.
Vị trí các file cài đặt
Theo thứ tự ưu tiên:
~/.claude/settings.json— toàn cục (tất cả project).claude/settings.json— theo project (có thể chia sẻ,
được commit).claude/settings.local.json— theo project (cục bộ,
bị gitignore)
Dùng .claude/settings.local.json cho review hook
để nó không ảnh hưởng đến các cộng tác viên khác.
Cấu hình hook
Timeout đặt 10 giây — bước check rất nhanh. Con số này
thấp hơn nhiều so với 300 giây sẽ cần cho một
bản review đồng bộ.
Vì sao bất đồng bộ lại quan trọng
Cách làm đồng bộ thì đơn giản hơn — chạy toàn bộ bản review ngay bên trong Stop hook — nhưng vướng ba vấn đề:
- Chặn.
codex exec reviewcó thể mất vài phút.
Một Stop hook đồng bộ sẽ chặn Claude Code suốt
thời gian đó — không thấy được tiến độ, không có cách
để hủy. - Không lọc. Hook kích hoạt sau mỗi phản hồi,
kể cả khi Claude vừa trả lời một câu hỏi
mà không thực hiện thay đổi code nào. - Review trùng lặp. Không có gì ngăn hook
kích hoạt một bản review thứ hai trong khi một bản
đang chạy.
Cách làm bất đồng bộ xử lý được cả ba: bước check nhanh (<1s), chỉ kích hoạt khi có thay đổi, hash diff stat để bỏ qua khi không có gì thay đổi kể từ lần check trước, và văn bản reason chỉ dẫn Claude bỏ qua nếu đã có một bản review đang chạy. Bản review thật sự thì chạy như một background task của Claude Code, và người dùng có thể theo dõi hoặc hủy nó.
Kiến trúc hai lệnh
Công cụ được chia thành hai lệnh: check (cổng kiểm tra nhanh, do hook gọi) và review (công việc thật sự, do Claude spawn như một background task).
Xây dựng lệnh check
Lệnh check chạy trên mỗi sự kiện Stop và phải hoàn tất trong chưa đầy một giây.
Bước check dùng git diff --stat HEAD để có một bản
tóm tắt ngắn gọn về những gì đã thay đổi, và lùi về
dùng git status --porcelain cho các file chưa được theo dõi.
Nó hash diff stat rồi lưu vào
.git/redline-last-diff — nếu diff không đổi
so với lần check trước, hook thoát ra một cách lặng lẽ. Nhờ vậy
mà cùng một diff không liên tục kích hoạt
hook. Diff stat được đưa vào văn bản reason để
Claude tự quyết định xem các thay đổi có đáng
review hay không.
Xây dựng lệnh review
Lệnh review do Claude spawn như một background task. Nó stream output của Codex theo thời gian thực để hiển thị tiến độ, rồi in ra một bản tóm tắt cuối cùng.
Các chi tiết chính:
codex exec review --uncommitted— review tất cả
các thay đổi đã staged, chưa staged và chưa được theo dõistdio: "inherit"— stream output của Codex theo
thời gian thực để background task hiển thị tiến độ-o <file>— ghi thông điệp cuối cùng của agent vào một
file để thu thập output một cách đáng tin cậy-c 'model_provider="tram"'— route
qua Trạm AI- Tùy chọn:
-c 'model="~openai/gpt-latest"'để
override model - Exit code được kiểm tra — nếu Codex thất bại và không
tạo ra output nào, công cụ thoát với một lỗi
Văn bản reason chỉ dẫn Claude
Trường reason của lệnh check chứa diff
stat, và để Claude tự quyết định có review hay không:
Claude thấy bản tóm tắt, đánh giá xem các thay đổi có thực chất hay không, rồi hoặc spawn review như một background task, hoặc bỏ qua. Khi bản review hoàn tất, Claude đọc output đã được stream và trình bày các phát hiện.
Cài đặt và gỡ bỏ hook
Công cụ nên có sẵn các lệnh để tự động cài đặt
và gỡ bỏ hook khỏi
.claude/settings.local.json.
Cài đặt
Đọc .claude/settings.local.json, deep-merge mục
Stop hook, rồi ghi lại. Tạo thư mục .claude/
nếu cần. Lệnh này phải có tính idempotent — nếu hook
đã tồn tại với cùng cấu hình thì bỏ qua; nếu nó
tồn tại với một model khác thì cập nhật lại. Hook
được nhận diện bằng tiền tố lệnh (các lệnh bắt đầu bằng
"redline").
File kết quả:
Gỡ bỏ
Lọc bỏ các mục hook có command bắt đầu bằng
"redline". Dọn dẹp các mảng và đối tượng rỗng
(xóa Stop: [] nếu rỗng, xóa hooks: {} nếu
rỗng).
Triển khai
Ghép tất cả lại
CLI đầy đủ có bốn lệnh:
Điểm vào CLI đầy đủ
Kiểm thử
Xác minh việc cài đặt hook
Người dùng sẽ thấy mục Stop hook với lệnh
redline check và timeout 10 giây.
Kiểm thử check khi không có thay đổi
Đảm bảo working tree sạch, sau đó:
Không có output nào — bước check thoát ra lặng lẽ khi không còn thay đổi nào chưa được commit.
Kiểm thử check khi có thay đổi
Thực hiện một thay đổi nhỏ với bất kỳ file nào, sau đó:
Người dùng sẽ thấy JSON có "decision": "block" và một
"reason" chứa bản tóm tắt diff stat và
các chỉ dẫn review.
Kiểm thử review
Người dùng sẽ thấy output của Codex được stream, theo sau là một
bản tóm tắt review.
Kiểm thử tích hợp đầy đủ
- Cài đặt hook:
redline install - Khởi động Claude Code:
claude - Yêu cầu Claude thực hiện một thay đổi code nhỏ
- Khi Claude hoàn tất, Stop hook kích hoạt bước
check — nếu có các thay đổi chưa commit, Claude
spawn review như một background task - Người dùng có thể tiếp tục làm việc trong khi bản review chạy
- Khi bản review hoàn tất, Claude đọc output
và trình bày bất kỳ phát hiện nào
Hạn chế và hướng phát triển
Chỉ dành cho Claude Code
Pattern này dựa vào output hook
decision: "block" của Claude Code, vốn đưa
các chỉ dẫn thẳng vào cuộc hội thoại của agent.
Hệ thống hook của Codex CLI (tính đến đầu năm 2026) còn
hạn chế hơn — Stop hook của nó theo kiểu fire-and-forget,
không thể đưa structured output trở lại vào context của
model. Các native hook ([[hooks]] trong config.toml)
hỗ trợ một số sự kiện, nhưng chỉ SessionStart mới đưa được
stdout vào model. Không có cơ chế nào tương đương với
decision: "block" + reason để chèn
chỉ dẫn giữa phiên. Khi Codex bổ sung hỗ trợ đầy đủ cho
structured hook output, pattern này có thể được
mở rộng thêm.
Mức độ chi tiết của review
Bản review bao quát mọi thứ chưa được commit — tất cả các thay đổi đã staged, chưa staged và chưa được theo dõi. Nó không phân biệt giữa thay đổi Claude vừa thực hiện và công việc chưa commit có sẵn từ trước. Các phiên bản sau này có thể dùng cơ chế phát hiện thay đổi thông minh hơn (ví dụ, so diff với một snapshot cơ sở được chụp trước phản hồi của Claude).