Tùy chỉnh Google Antigravity với rules và workflows


Google Antigravity đã được công bố vào tuần trước với tư cách là IDE có tính agent (agentic IDE) thế hệ mới. Cho đến nay, tôi rất ấn tượng với nó. Nó đã giúp tôi nâng cấp blog của mình lên phiên bản Hugo mới nhất (một việc mà tôi đã trì hoãn từ lâu). Nó thậm chí còn nhận ra rằng một số shortcode (ví dụ: Twitter) từ phiên bản cũ đã thay đổi trong phiên bản mới và tự động cập nhật các bài đăng trên blog của tôi với phiên bản shortcode mới. Tuyệt vời!
Có rất nhiều bài blog viết về sự tuyệt vời của Antigravity và cũng có một codelab hướng dẫn. Một khi bạn đã vượt qua sự phấn khích ban đầu về Antigravity, bạn sẽ muốn tùy chỉnh nó để đảm bảo nó hoạt động chính xác theo ý muốn của mình. Đó chính là chủ đề của bài viết này.
Rules và Workflows
Antigravity đi kèm với một vài tùy chọn tùy chỉnh mà có thể bạn chưa biết. Nếu bạn nhấp vào dấu ... ở góc trên cùng bên phải và chọn Customizations, bạn sẽ thấy Rules và Workflows là hai tùy chọn tùy chỉnh:

Rules (Quy tắc) giúp định hướng hành vi của agent. Đây là những hướng dẫn bạn có thể cung cấp để đảm bảo agent tuân theo khi tạo code, test, v.v. Ví dụ, bạn có thể muốn agent tuân theo một phong cách code nhất định, hoặc luôn ghi tài liệu cho các phương thức. Bạn có thể thêm chúng dưới dạng các quy tắc và agent sẽ xem xét chúng.
Workflows (Luồng công việc) là các prompt đã lưu mà bạn có thể kích hoạt theo yêu cầu bằng dấu / khi tương tác với agent. Chúng tương tự như Rules ở chỗ chúng cũng định hướng hành vi của agent nhưng được người dùng kích hoạt theo yêu cầu.
Có thể ví von một cách dễ hiểu rằng Rules giống như các chỉ thị hệ thống (system instructions), trong khi Workflows giống như các prompt đã lưu mà bạn có thể chọn theo yêu cầu.
Cả Rules và Workflows đều có thể được áp dụng toàn cục hoặc cho từng workspace và được lưu vào các vị trí sau:
- Quy tắc toàn cục:
~/.gemini/GEMINI.md - Luồng công việc toàn cục:
~/.gemini/antigravity/global_workflows/global-workflow.md - Quy tắc trong workspace:
your-workspace/.agent/rules/ - Luồng công việc trong workspace:
your-workspace/.agent/workflows/
Bây giờ, hãy xem một ví dụ cụ thể.
Không có rules và workflows
Giả sử chúng ta muốn triển khai một số thuật toán tìm kiếm và sắp xếp cơ bản với Antigravity.
Đầu tiên, hãy thử làm điều này mà không có bất kỳ quy tắc hay luồng công việc nào và xem chúng ta nhận được gì.
Chúng ta có thể bắt đầu với một tệp main.py trống:
def main():
pass
if __name__ == "__main__":
main()
Sau đó, yêu cầu Antigravity: Implement binary search and bubble sort.
Bạn có thể sẽ nhận được kết quả tương tự như sau:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = left + (right - left) // 2 # Avoid potential overflow
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
def bubble_sort(arr):
n = len(arr)
for i in range(n):
# Flag to optimize for already sorted arrays
swapped = False
# Last i elements are already in place
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
swapped = True
# If no swaps occurred, array is sorted
if not swapped:
break
return arr
def main():
print("=" * 50)
print("BINARY SEARCH DEMONSTRATION")
print("=" * 50)
# Binary Search Examples
sorted_arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
print(f"\nSorted array: {sorted_arr}")
test_values = [7, 15, 1, 19, 10, 20]
print("\nIterative Binary Search:")
for val in test_values:
result = binary_search(sorted_arr, val)
if result != -1:
print(f" Found {val} at index {result}")
else:
print(f" {val} not found in array")
print("\n" + "=" * 50)
print("BUBBLE SORT DEMONSTRATION")
print("=" * 50)
# Bubble Sort Examples
unsorted_arr1 = [64, 34, 25, 12, 22, 11, 90]
print(f"\nOriginal array: {unsorted_arr1}")
bubble_sort(unsorted_arr1)
print(f"Sorted array: {unsorted_arr1}")
if __name__ == "__main__":
main()
Khi bạn chạy, nó hoạt động:
python main.py
==================================================
BINARY SEARCH DEMONSTRATION
==================================================
Sorted array: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
Iterative Binary Search:
Found 7 at index 3
Found 15 at index 7
Found 1 at index 0
Found 19 at index 9
10 not found in array
20 not found in array
==================================================
BUBBLE SORT DEMONSTRATION
==================================================
Original array: [64, 34, 25, 12, 22, 11, 90]
Sorted array: [11, 12, 22, 25, 34, 64, 90]
Thật ấn tượng khi chúng ta có được code hoạt động và một số ví dụ về cách chạy nó chỉ trong một giây! Nhưng code không có tài liệu, mọi thứ đều được đặt trong một tệp main.py duy nhất, không có unit test, v.v.
Hãy xem liệu chúng ta có thể áp dụng một số quy tắc và luồng công việc để làm cho điều này tốt hơn không.
Thêm quy tắc
Hãy thêm một vài quy tắc. Như tôi đã đề cập trước đây, các quy tắc và luồng công việc có thể là toàn cục hoặc cho từng workspace. Trong trường hợp này, chúng ta hãy thêm chúng cho workspace.
Đầu tiên, hãy thêm quy tắc code-style-guide.md sau đây cho phong cách code và bình luận cơ bản:
* Make sure all the code is styled with PEP 8 style guide
* Make sure all the code is properly commented
Thứ hai, hãy thêm một quy tắc khác để đảm bảo code được tạo theo cách module hóa hơn với các ví dụ trong code-generation-guide.md:
* The main method in main.py is the entry point to showcase functionality.
* Do not generate code in the main method. Instead generate distinct functionality in a new file (eg. feature_x.py)
* Then, generate example code to show the new functionality in a new method in main.py (eg. example_feature_x) and simply call that method from the main method.
Hai quy tắc đã được lưu và sẵn sàng:

Thêm một luồng công việc
Tiếp theo, hãy định nghĩa một luồng công việc để tạo unit test. Tôi chọn định nghĩa nó như một luồng công việc, vì tôi muốn có tùy chọn kích hoạt việc tạo unit test một khi tôi đã hài lòng với code (thay vì để agent luôn tạo unit test).
Đây là định nghĩa của luồng công việc generate-unit-tests.md:
* Generate unit tests for each file and each method
* Make sure the unit tests are named similar to files but with test_ prefix
Luồng công việc của tôi bây giờ cũng đã sẵn sàng:

Với rules và workflows
Bây giờ, chúng ta đã sẵn sàng để tạo code lại với Antigravity. Tôi đã xóa tất cả code được tạo trước đó và hỏi Antigravity câu hỏi tương tự: Implement binary search and bubble sort.
Sau một hoặc hai phút, tôi nhận được ba tệp trong workspace của mình: main.py, bubble_sort.py, binary_search.py và thật tuyệt khi thấy tất cả các quy tắc của tôi đều được áp dụng.
Ví dụ, tệp binary_search.py được ghi tài liệu gọn gàng và có phong cách tốt:
"""
Binary Search Algorithm Implementation
This module provides an implementation of the binary search algorithm,
which efficiently searches for a target value in a sorted list.
Time Complexity: O(log n)
Space Complexity: O(1)
"""
def binary_search(arr, target):
"""
Perform binary search on a sorted array to find the target value.
Args:
arr (list): A sorted list of comparable elements
target: The value to search for in the array
Returns:
int: The index of the target if found, -1 otherwise
Example:
>>> binary_search([1, 3, 5, 7, 9], 5)
2
>>> binary_search([1, 3, 5, 7, 9], 6)
-1
"""
left = 0
right = len(arr) - 1
while left <= right:
# Calculate middle index (avoiding potential overflow)
mid = left + (right - left) // 2
# Check if target is at mid
if arr[mid] == target:
return mid
# If target is greater, ignore left half
elif arr[mid] < target:
left = mid + 1
# If target is smaller, ignore right half
else:
right = mid - 1
# Target not found
return -1
Phương thức main trong main.py rất gọn gàng và sạch sẽ:
def main():
"""
Main entry point to showcase binary search and bubble sort functionality.
"""
example_binary_search()
example_bubble_sort()
print("\n" + "=" * 50)
if __name__ == "__main__":
main()
Nó cũng có các phương thức ví dụ mà tôi đã yêu cầu:
def example_bubble_sort():
"""
Demonstrate bubble sort algorithm with various test cases.
"""
print("\n" + "=" * 50)
print("Bubble Sort Examples")
print("=" * 50)
# Example 1: Basic sorting - unsorted array
arr1 = [64, 34, 25, 12, 22, 11, 90]
print(f"\nOriginal array: {arr1}")
sorted_arr1 = bubble_sort(arr1.copy())
print(f"Sorted (ascending): {sorted_arr1}")
Tuyệt vời! Phần cuối cùng là unit test. Bây giờ tôi đã hài lòng với code, hãy xem liệu tôi có thể kích hoạt luồng công việc tạo unit test không.
Tôi vào cuộc trò chuyện và bắt đầu gõ /generate và Antigravity đã biết về luồng công việc của tôi:

Tôi chọn và nhấn enter. Vài giây sau, tôi nhận được các tệp mới trong workspace của mình: test_binary_search.py, test_bubble_sort.py:

Và một số bài test đã được triển khai cho tôi trong test_bubble_sort.py:
"""
Unit tests for bubble_sort module.
This module contains comprehensive unit tests for both ascending and
descending bubble sort implementations.
"""
import unittest
from bubble_sort import bubble_sort, bubble_sort_descending
class TestBubbleSort(unittest.TestCase):
"""Test cases for the bubble_sort function (ascending order)."""
def test_unsorted_array(self):
"""Test sorting a basic unsorted array."""
arr = [64, 34, 25, 12, 22, 11, 90]
expected = [11, 12, 22, 25, 34, 64, 90]
result = bubble_sort(arr.copy())
self.assertEqual(result, expected)
def test_already_sorted(self):
"""Test sorting an already sorted array (best case)."""
arr = [1, 2, 3, 4, 5, 6, 7]
expected = [1, 2, 3, 4, 5, 6, 7]
result = bubble_sort(arr.copy())
self.assertEqual(result, expected)
...
Thực tế có tổng cộng 61 bài test, nhiều hơn rất nhiều so với những gì tôi tự viết!
pytest
=============================================================== test session starts ================================================================
platform darwin -- Python 3.13.0, pytest-7.4.3, pluggy-1.6.0
rootdir: /Users/atamel/dev/local/testing/antigravity/rules-workflows
plugins: anyio-4.10.0
collected 61 items
test_binary_search.py ............................... [ 50%]
test_bubble_sort.py .............................. [100%]
================================================================ 61 passed in 0.03s ================================================================
Kết luận
Trong bài viết này, tôi đã chỉ cho bạn cách tùy chỉnh Antigravity bằng các quy tắc và luồng công việc. Tôi cực kỳ ấn tượng với Antigravity, và tôi sẽ chia sẻ thêm nhiều mẹo và thủ thuật khác trong một bài viết sau. Dưới đây là một số liên kết để tìm hiểu thêm:
Theo dõi trên X