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ổng | Mặc định | Kiểm tra gì |
|---|---|---|
complexity | tối đa 10 | hàm bị chạm tới vượt ngưỡng complexity thì fail |
delta | tối đa +15 | hàm bị chạm tới tăng complexity quá mức này trong một lần thì fail |
dupe | 50 token | khối token đã chuẩn hoá lặp lại trong diff thì fail |
growth | +500 dòng | mộ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ệnh | Tác dụng |
|---|---|
diffgate check | Kiể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 github | Kiểm tra với base chỉ định và xuất annotation cho GitHub Actions. |
diffgate measure | Chỉ số liệu, không verdict — chế độ "đo trước". |
diffgate check --json diffgate-report.json | Lư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 githubPhươ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
- Nó không chứng minh code đúng. Cổng cấu trúc không chứng minh được ngữ nghĩa.
- Nó không phát hiện code do AI viết và không tuyên bố gì về tác giả. Bên trong không có "AI detector" giả khoa học.
- Số complexity là heuristic, không phải chân lý phổ quát. Ngưỡng chỉnh được qua flag hoặc
diffgate.json. - Nó kiểm tra diff, không phải repo. Nợ kỹ thuật cũ là ngữ cảnh, không bao giờ là lý do fail.
- So sánh trung thực (kiểm tra 2026-10-31): unclebob/ub-mode hơn ở độ sâu quy trình — dẫn cả workflow của agent, còn diffgate chỉ là check 2 giây trong CI (bổ sung, không cạnh tranh). SonarQube / SonarCloud hơn ở lịch sử: dashboard xu hướng, leak-period, 30+ ngôn ngữ; diffgate nhìn một diff, ba ngôn ngữ, không server. lizard hơn ở độ phủ ngôn ngữ (20+ ngôn ngữ) và tích hợp editor; nó báo số, diffgate thêm verdict, gating PR và annotation. Semgrep hơn ở rule tuỳ biến; diffgate đi kèm cổng cố định với default hợp lý — không viết rule, không bảo trì rule.
Mã nguồn + README trên GitHub → · Báo lỗi → · ask@techdev.fun
Lộ trình
- Đếm dòng mới không có coverage khi có file lcov/cobertura
- Mutation-lite trên dòng đã đổi
- Thêm ngôn ngữ (Java, C#, Rust)
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.