TECHDEV · Flagship · Công cụ open-source

diffgate

Cổng kiểm tra 2 giây trước khi merge cho diff AI viết. AI viết code nhanh hơn con người review: test vẫn pass mà bug lọt, complexity âm thầm tăng, và review bằng mắt không còn scale được. diffgate kiểm tra chính cái diff trong CI — complexity mới của PR này, duplication mới của PR này, khả năng review của PR này — pass hoặc fail, kèm lý do. Chạy local, xác định, không model, không tài khoản, không mạng.

TypeScript · CLI · MIT · Node 20+ · Không phụ thuộc runtime nào · npm: diffgate-cli. Chạy local và xác định: code của bạn không bao giờ rời máy.

Bài toán nó giải

Trợ lý AI viết diff hàng trăm dòng trong vài giây, và nút thắt cổ chai chuyển từ viết sang đọc. Test có thể pass trong khi complexity len lỏi tăng và duplication lan rộng, vì test kiểm tra hành vi chứ không kiểm tra cấu trúc. Người review lướt qua diff 400 dòng rồi approve theo cảm tính. diffgate trả lời một câu hỏi hẹp và trung thực trước khi merge: diff này có review được không? Nó chỉ kiểm tra code đã đổi — nợ kỹ thuật cũ là ngữ cảnh, không bao giờ là lý do fail — và đánh fail khi một hàm bị chạm tới quá phức tạp, tăng complexity quá nhiều trong một lần, lặp lại một khối code đã chuẩn hoá, hoặc khi một file duy nhất phình quá mức review được.

Bốn cổng kiểm tra (tất cả trên diff, v1)

CổngMặc địnhKiểm tra gì
complexitytối đa 10hàm bị chạm tới vượt ngưỡng complexity thì fail
deltatối đa +15hàm bị chạm tới tăng complexity quá mức này trong một lần thì fail
dupe50 tokenkhối token đã chuẩn hoá lặp lại trong diff thì fail
growth+500 dòngmột file tăng quá mức này thì fail ("chia nhỏ PR ra")

Ngưỡng chỉnh được qua flag (--max-complexity N, --max-delta N, …) hoặc file diffgate.json ở gốc repo (xem diffgate.example.json). Ngôn ngữ v1: JavaScript/TypeScript, Python, Go. Diff 500 file kiểm tra trong ~0,7 giây trên laptop.

Bốn lệnh

LệnhTác dụng
diffgate checkKiểm tra diff hiện tại. Base tự phát hiện: merge-base với main, nếu không thì HEAD~1. Pass thì exit 0, fail thì exit 1.
diffgate check --base origin/main --format githubKiểm tra với base chỉ định và xuất annotation cho GitHub Actions.
diffgate measureChỉ số liệu, không verdict — chế độ "đo trước".
diffgate check --json diffgate-report.jsonLưu manifest JSON cho tooling.

Lệnh chép nguyên từ README diffgate (bản 2026-10-31). Định dạng output: human (bảng mặc định), json (manifest kèm result: pass|fail), github (annotation ::error file=…,line=…::). Gắn thẳng vào CI:

# Yêu cầu Node 20+, không phụ thuộc runtime
npm install -g diffgate-cli
diffgate check
# hoặc chạy không cần cài
npx -y diffgate-cli check --base ${{ github.event.pull_request.base.sha }} --format github

Phương pháp — nói thẳng

Complexity là xấp xỉ cyclomatic dựa trên token: đếm từ khoá rẽ nhánh và toán tử (if, for, while, &&, ||, ??, ternary, elif, except, …) trên mỗi hàm. Cùng lớp với lizard: nhanh và xác định, không phải cấp độ compiler. Phát hiện duplication chuẩn hoá identifier thành id và literal thành str/num, rồi tìm cửa sổ token lặp bằng rolling hash — nên copy-paste đổi tên biến vẫn bị bắt.

Đây KHÔNG phải — và đối thủ hơn ta ở đâu

Mã nguồn + README trên GitHub → · Báo lỗi → · ask@techdev.fun

Lộ trình

Phát triển: npm install, npm run build (tsc, strict), npm test — 38 test đều pass ở bản release. examples/sample-diff/ là repo base/pr/fixed giả lập kiểm tra mọi cổng: chạy examples/sample-diff/run.sh để xem luồng đỏ→xanh.

Giấy phép

MIT. Xem LICENSE trong repo.

Công cụ liên quan

Thêm công cụ open-source từ TECHDEV: sessguard, runverdict, gheist-guard, vetgate, context-diet, ci-failure-detective, agent-seatbelt, devsecops-os, env-doctor, skill-audit, logtrim, testguard, breakcheck, keymap, memgraph, ggufit, leaseguard, factfence, jsonfold

Có ý kiến?

Bình chọn cho công cụ này, đề xuất tính năng, hoặc thảo luận với các operator khác trên community board.