Chúng tôi đã tạo một linter quy ước mã nguồn dựa trên LLM.
(github.com/DevSymphony)Xin chào! Chúng tôi là Symphony, một nhóm sinh viên đại học đang phát triển sym-cli.
Dạo gần đây mọi người có hay dùng các công cụ như Cursor hay Claude Code để vibe coding không? Nhóm chúng tôi cũng đang tích cực tận dụng LLM trong quá trình phát triển. Nhưng khi dùng một thời gian, chúng tôi thấy có một điểm khá đáng tiếc.
Mã do AI viết ra thì về mặt chức năng chạy khá tốt, nhưng lại liên tục bỏ qua các quy ước riêng của nhóm chúng tôi (cách đặt tên biến, phong cách viết chú thích, quy tắc sử dụng một số thư viện nhất định, v.v.). Lần nào cũng phải ghi các quy tắc vào prompt thì rất phiền, mà dùng lâu dần còn dẫn đến việc ngày càng quên mất convention nữa.
Vì vậy, từ câu hỏi “Liệu có thể khiến LLM tự kiểm tra convention trước khi viết code, hoặc trong lúc đang viết code hay không?” mà chúng tôi bắt đầu tạo ra sym-cli.
[sym-cli là gì?]
sym-cli là một linter quy ước mã nguồn dựa trên chính sách dành cho các công cụ AI coding. Điểm cốt lõi là nó giao tiếp trực tiếp với LLM bằng cách tận dụng MCP.
Điểm khác với các linter hiện có là như sau.
- (Thiết lập bằng ngôn ngữ tự nhiên) Thay vì file cấu hình phức tạp, bạn có thể định nghĩa quy tắc bằng ngôn ngữ tự nhiên như “tuyệt đối không viết log bằng print”, và LLM sẽ hiểu cũng như tuân theo.
- (Tối ưu hóa context) LLM không cần đọc toàn bộ mọi quy tắc của dự án, mà sẽ thông minh lấy ra chỉ những quy tắc cần thiết cho công việc hiện tại thông qua công cụ MCP.
- (Kiểm tra chủ động) Thông qua công cụ
validate_code, LLM có thể tự kiểm tra việc tuân thủ quy tắc ngay sau khi tạo mã.
[Nó hoạt động như thế nào?]
Sau khi tải lệnh sym và chạy lệnh sym init, cấu hình máy chủ MCP sẽ được thiết lập tự động, nhờ đó các IDE hỗ trợ MCP (như Cursor) hoặc các công cụ LLM sẽ ngay lập tức bắt đầu tham chiếu các quy tắc này.
[Rất mong nhận được phản hồi!]
Chúng tôi vẫn là một nhóm sinh viên đại học, và dự án hiện cũng chỉ mới ở giai đoạn đầu vừa hình thành khung sườn. Còn nhiều thiếu sót và cũng có thể có lỗi. Tuy vậy, sự ủng hộ và phản hồi từ các nhà phát triển đang làm việc thực tế hoặc những người quan tâm nhiều đến các công cụ LLM là điều chúng tôi thực sự rất cần.
Dù là “sẽ tốt nếu có tính năng này”, “phần này có vẻ có vấn đề về mặt cấu trúc”, hay “trong môi trường thực tế người ta dùng như thế này”, thì bất kỳ ý kiến nào chúng tôi cũng đều rất biết ơn khi được lắng nghe. Vì đây là mã nguồn mở, nên mọi đóng góp hay GitHub Star đều là nguồn động viên rất lớn đối với nhóm chúng tôi!
GitHub Repository: https://github.com/DevSymphony/sym-cli
npm: npm install -g @dev-symphony/sym
Cảm ơn bạn đã đọc.
7 bình luận
Nếu dùng opencode thì bạn có thể đưa cả tính năng lint vào workflow luôn
https://vi.news.hada.io/topic?id=21883
https://opencode.ai/docs/formatters/
Tôi đồng ý. Với những thứ có thể bắt được ngay như lỗi cú pháp hoặc lỗi kiểu, tôi nghĩ giai đoạn LSP hay biên dịch là hiệu quả nhất, và đó cũng là cách tiếp cận hợp lý về mặt mức sử dụng token. Bên tôi cũng xem LLM không phải để thay thế điều này, mà gần hơn với vai trò tự động kết nối các quy tắc được viết bằng ngôn ngữ tự nhiên vào quy trình lint/test hiện có.
Tôi cũng nghĩ giống như t7vonn rằng convention nên được chuẩn hóa bằng công cụ tự động hóa.
Nhưng tôi cảm nhận khá rõ sự khác biệt của tính năng LSP, vì nó có thể phát hiện ngay các lỗi cú pháp mà bình thường phải chạy test hoặc compile mới bắt được, nên lượng token sử dụng cũng giảm đi.
Ngay cả bây giờ thì kiểu giao cho PR review agent tài liệu convention cùng với diff để tìm những phần còn sót lại cũng đã làm được rồi.. và có lẽ tôi sẽ không dùng hơn mức đó.
Tôi đính kèm bài viết của một người có quan điểm khá giống tôi.
Tôi nghĩ cách sử dụng mà bạn nói là cách tiếp cận thực tế nhất ở thời điểm hiện tại. Vấn đề mà chúng tôi muốn giải quyết là giảm bớt quá trình phải đưa tài liệu quy ước vào mỗi PR, và chuyển trước các quy tắc được định nghĩa bằng ngôn ngữ tự nhiên thành quy tắc lint/kiểm chứng để có thể tự động chạy ở giai đoạn PR/CI.
Ừm.. có vẻ cũng có thể làm bằng kiểu tính năng như hooks/subagents/skill của Claude..
Về mặt kỹ thuật, có vẻ cũng có thể làm bằng hooks hoặc subagent, nhưng để không bị phụ thuộc vào một LLM cụ thể, chúng tôi đã chọn đặt một lớp mỏng trên MCP và quy trình làm việc của linter hiện có. Vì vậy, thay vì tập trung vào các tính năng agent, chúng tôi đang tập trung vào việc biến convention thành hạ tầng có thể tái sử dụng.