Chuyển tới nội dung chính

Đánh giá mã GitHub - Đánh giá PR: khác biệt, nhận xét nội tuyến thông qua gh hoặc REST

{/* Trang này được tạo tự động từ SKILL.md của kỹ năng bởi website/scripts/generate-skill-docs.py. Chỉnh sửa nguồn SKILL.md, không phải trang này. */}`#Đánh giá mã GitHub

Xem lại PR: khác biệt, nhận xét nội tuyến thông qua gh hoặc REST.

Siêu dữ liệu kỹ năng

NguồnĐi kèm (được cài đặt theo mặc định)
Đường dẫn

skills/GitHub/GitHub-code-review ` | | Phiên bản |

1.1.0 ` | | Tác giả | Đại lý Hermes | | Giấy phép | MIT | | Nền tảng | Linux, macOS, Windows | | Thẻ |

GitHub

, `Code-Review

, `Pull-Requests

, `Git

, Quality | | Kỹ năng liên quan | XPROTECTX33XPROTECTX, XPROTECTX34XPROTECTX |

Tham khảo: đầy đủ SKILL.md

thông tin

Sau đây là định nghĩa kỹ năng đầy đủ mà Hermes tải khi kỹ năng này được kích hoạt. Đây là những gì tác nhân coi là hướng dẫn khi kỹ năng được kích hoạt.

#Đánh giá mã GitHub

Thực hiện đánh giá mã về các thay đổi cục bộ trước khi đẩy hoặc xem xét các PR mở trên GitHub. Hầu hết kỹ năng này sử dụng git đơn giản - việc phân chia `gh

/ curl chỉ quan trọng đối với các tương tác ở cấp độ PR.

Điều kiện tiên quyết

  • Đã xác thực bằng GitHub (xem kỹ năng `GitHub-auth

)

  • Bên trong kho git

Thiết lập (để tương tác PR)

if command -v gh &>/dev/null && gh auth status &>/dev/null; then
AUTH="gh"
else
AUTH="git"
if [ -z "$GitHub_TOKEN" ]; then
if [ -f ~/.Hermes/.env ] && grep -q "^GitHub_TOKEN=" ~/.Hermes/.env; then
GitHub_TOKEN=$(grep "^GitHub_TOKEN=" ~/.Hermes/.env | head -1 | cut -d= -f2 | tr -d '\n\r')
elif grep -q "GitHub.com" ~/.git-credentials 2>/dev/null; then
GitHub_TOKEN=$(grep "GitHub.com" ~/.git-credentials 2>/dev/null | head -1 | sed 's|https://[^:]*:\([^@]*\)@.*|\1|')
fi
fi
fi

REMOTE_URL=$(git remote get-url origin)
OWNER_REPO=$(echo "$REMOTE_URL" | sed -E 's|.*GitHub\.com[:/]||; s|\.git$||')
OWNER=$(echo "$OWNER_REPO" | cut -d/ -f1)
REPO=$(echo "$OWNER_REPO" | cut -d/ -f2)

`

---

## 1. Xem lại các thay đổi cục bộ (Pre-Push)

Đây là
`git
` thuần túy - hoạt động ở mọi nơi, không cần API.

### Nhận được sự khác biệt

`bash

# Staged changes (what would be committed)
git diff --staged

# All changes vs main (what a PR would contain)
git diff main...HEAD

# File names only
git diff main...HEAD --name-only

# Stat summary (insertions/deletions per file)
git diff main...HEAD --stat

`

### Đánh giá chiến lược
1. **Có được bức tranh toàn cảnh trước:**

``` bash
git diff main...HEAD --stat
git log main..HEAD --oneline

`

2. **Xem lại từng tệp** — sử dụng
`read_file
` trên các tệp đã thay đổi để biết ngữ cảnh đầy đủ và phần khác biệt để xem điều gì đã thay đổi:

`bash
git diff main...HEAD -- src/auth/login.py

`

3. **Kiểm tra các vấn đề thường gặp:**

`bash

# Debug statements, TODOs, console.logs left behind
git diff main...HEAD | grep -n "print(\|console\.log\|TODO\|FIXME\|HACK\|XXX\|debugger"

# Large files accidentally staged
git diff main...HEAD --stat | sort -t'|' -k2 -rn | head -10

# Secrets or credential patterns
git diff main...HEAD | grep -in "password\|secret\|API_key\|token.*=\|private_key"

# Merge conflict markers
git diff main...HEAD | grep -n "<<<<<<\|>>>>>>\|======="

`

4. **Trình bày phản hồi có cấu trúc** cho người dùng.

### Xem lại định dạng đầu ra

Khi xem xét những thay đổi cục bộ, hãy trình bày những phát hiện trong cấu trúc này:

`
## Code Review Summary

### Critical
- **src/auth.py:45** — SQL injection: user input passed directly to query.
Suggestion: Use parameteriZed queries.

### Warnings
- **src/models/user.py:23** — Password stored in plaintext. Use bcrypt or argon2.
- **src/API/routes.py:112** — No rate limiting on login endpoint.

### Suggestions
- **src/utils/helpers.py:8** — Duplicates logic in
`src/core/utils.py:34

. Consolidate.
- **tests/test_auth.py** — Missing edge case: expired token test.

### Looks Good
- Clean separation of concerns in the middleware layer
- Good test coverage for the happy path

`

---

## 2. Xem xét yêu cầu kéo trên GitHub

### Xem chi tiết PR`**Với gh:**

``` bash
gh pr view 123
gh pr diff 123
gh pr diff 123 --name-only

`
``**Với git + cuộn tròn:**

`bash
PR_NUMBER=123

# Get PR details
curl -s \

-H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER \
| Python3 -c "
import sys, JSON
pr = JSON.load(sys.stdin)
print(f\"Title: \{pr['title']}\")
print(f\"Author: \{pr['user']['login']}\")
print(f\"Branch: \{pr['head']['ref']} -> \{pr['base']['ref']}\")
print(f\"State: \{pr['state']}\")
print(f\"Body:\n\{pr['body']}\")"

# List changed files
curl -s \
-H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/files \
| Python3 -c "
import sys, JSON
for f in JSON.load(sys.stdin):
print(f\"\{f['status']:10} +\{f['additions']:-4} -\{f['deletions']:-4} \{f['filename']}\")"

`

### Kiểm tra PR tại địa phương để đánh giá đầy đủ

Điều này hoạt động với
`git
` đơn giản - không cần
`gh

:

``` bash

# Fetch the PR branch and check it out
git fetch origin pull/123/head:pr-123
git checkout pr-123

# Now you can use read_file, search_files, run tests, etc.

# View diff against the base branch
git diff main...pr-123

`
``**Với gh (phím tắt):**

``` bash
gh pr checkout 123

`

### Để lại Bình luận về một bài PR`**Bình luận PR chung — với gh:**

`bash
gh pr comment 123 --body "Overall looks good, a few suggestions below."

`
``**Nhận xét PR chung — có đường cong:**

`bash
curl -s -X POST \

-H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$OWNER/$REPO/issues/$PR_NUMBER/comments \
-d '\{"body": "Overall looks good, a few suggestions below."}'

`

### Để lại nhận xét đánh giá nội tuyến`**Nhận xét nội tuyến duy nhất — với gh (thông qua API):**

``` bash
HEAD_SHA=$(gh pr view 123 --JSON headRefOid --jq '.headRefOid')

gh API repos/$OWNER/$REPO/pulls/123/comments \

--method POST \
-f body="This could be simplified with a list comprehension." \
-f path="src/auth/login.py" \
-f commit_id="$HEAD_SHA" \
-f line=45 \
-f side="RIGHT"

`
``**Nhận xét nội tuyến duy nhất — có đường cong:**

``` bash

# Get the head commit SHA
HEAD_SHA=$(curl -s \
-H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER \
| Python3 -c "import sys,JSON; print(JSON.load(sys.stdin)['head']['sha'])")

curl -s -X POST \
-H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/comments \
-d "{
\"body\": \"This could be simplified with a list comprehension.\",
\"path\": \"src/auth/login.py\",
\"commit_id\": \"$HEAD_SHA\",
\"line\": 45,
\"side\": \"RIGHT\"
}"

`

### Gửi đánh giá chính thức (Phê duyệt / Yêu cầu thay đổi)

**Với gh:**

``` bash
gh pr review 123 --approve --body "LGTM!"
gh pr review 123 --request-changes --body "See inline comments."
gh pr review 123 --comment --body "Some suggestions, nothing blocking."

`
``**Với tính năng cuộn tròn — bài đánh giá có nhiều nhận xét được gửi nguyên tử:**

`bash
HEAD_SHA=$(curl -s \

-H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER \
| Python3 -c "import sys,JSON; print(JSON.load(sys.stdin)['head']['sha'])")

curl -s -X POST \
-H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$OWNER/$REPO/pulls/$PR_NUMBER/reviews \
-d "{
\"commit_id\": \"$HEAD_SHA\",
\"event\": \"COMMENT\",
\"body\": \"Code review from Hermes Agent\",
\"comments\": [
\{\"path\": \"src/auth.py\", \"line\": 45, \"body\": \"Use parameteriZed queries to prevent SQL injection.\"},
\{\"path\": \"src/models/user.py\", \"line\": 23, \"body\": \"Hash passwords with bcrypt before storing.\"},
\{\"path\": \"tests/test_auth.py\", \"line\": 1, \"body\": \"Add test for expired token edge case.\"}
]
}"

`
``Giá trị sự kiện:

"APPROVE"

,

"REQUEST_CHANGES"

,

"COMMENT"
``Trường
`line
` đề cập đến số dòng trong phiên bản *mới* của tệp. Đối với các dòng đã xóa, hãy sử dụng

"side": "LEFT"

.

---

## 3. Danh sách kiểm tra đánh giá

Khi thực hiện đánh giá mã (địa phương hoặc PR), hãy kiểm tra một cách có hệ thống:

### Tính đúng đắn
- Đoạn mã có làm được những gì nó tuyên bố không?
- Đã xử lý các trường hợp biên (đầu vào trống, giá trị rỗng, dữ liệu lớn, truy cập đồng thời)?
- Đường dẫn lỗi được xử lý khéo léo?

### Bảo mật
- Không có bí mật, thông tin xác thực hoặc khóa API được mã hóa cứng
- Xác thực đầu vào trên đầu vào hướng tới người dùng
- Không tiêm SQL, XSS hoặc truyền tải đường dẫn
- Kiểm tra Auth/authz khi cần thiết

### Chất lượng mã
- Đặt tên rõ ràng (biến, hàm, lớp)
- Không có sự phức tạp không cần thiết hoặc trừu tượng sớm
- DRY - không có logic trùng lặp nào cần được trích xuất
- Chức năng được tập trung (trách nhiệm duy nhất)`###Thử nghiệm
- Đường dẫn mã mới đã được thử nghiệm chưa?
- Đường dẫn hạnh phúc và các trường hợp lỗi được bảo hiểm?
- Kiểm thử có thể đọc và bảo trì được không?

### Hiệu suất
- Không có truy vấn N+1 hoặc vòng lặp không cần thiết
- Bộ nhớ đệm thích hợp khi có lợi
- Không có hoạt động chặn trong đường dẫn mã không đồng bộ

### Tài liệu
- Các API công khai được ghi lại
- Logic không rõ ràng có bình luận giải thích "tại sao"
- README cập nhật nếu hành vi thay đổi

---

## 4. Quy trình đánh giá trước khi đẩy

Khi người dùng yêu cầu bạn "xem lại mã" hoặc "kiểm tra trước khi đẩy":
1.
`git diff main...HEAD --stat

- xem phạm vi thay đổi
2.
`git diff main...HEAD
` — đọc toàn bộ khác biệt
3. Đối với mỗi tệp đã thay đổi, hãy sử dụng
`read_file
` nếu bạn cần thêm ngữ cảnh
4. Áp dụng danh sách kiểm tra ở trên
5. Trình bày các phát hiện ở định dạng có cấu trúc (Quan trọng / Cảnh báo / Đề xuất / Có vẻ ổn)
6. Nếu tìm thấy vấn đề nghiêm trọng, hãy đề nghị khắc phục chúng trước khi người dùng đẩy

---

## 5. Quy trình đánh giá PR (Từ đầu đến cuối)Khi người dùng yêu cầu bạn "xem lại PR #N", "xem PR này" hoặc cung cấp cho bạn URL PR, hãy làm theo công thức sau:

### Bước 1: Thiết lập môi trường

``` bash
source "$\{Hermes_HOME:-$HOME/.Hermes}/skills/GitHub/GitHub-auth/scripts/gh-env.sh"

# Or run the inline setup block from the top of this skill

`

### Bước 2: Thu thập bối cảnh PR

Nhận siêu dữ liệu PR, mô tả và danh sách các tệp đã thay đổi để hiểu phạm vi trước khi đi sâu vào mã.

**Với gh:**

`
``` bash
gh pr view 123
gh pr diff 123 --name-only
gh pr checks 123

`
``**Với độ cong:**

`
`bash
PR_NUMBER=123

# PR details (title, author, description, branch)
curl -s -H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER

# Changed files with line counts
curl -s -H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER/files

`

### Bước 3: Kiểm tra PR tại địa phương

Điều này cung cấp cho bạn quyền truy cập đầy đủ vào
`read_file

,
`search_files
` và khả năng chạy thử nghiệm.

`bash
git fetch origin pull/$PR_NUMBER/head:pr-$PR_NUMBER
git checkout pr-$PR_NUMBER

`

### Bước 4: Đọc khác biệt và hiểu các thay đổi

`bash

# Full diff against the base branch
git diff main...HEAD

# Or file-by-file for large PRs
git diff main...HEAD --name-only
# Then for each file:
git diff main...HEAD -- path/to/file.py

`
``Đối với mỗi tệp đã thay đổi, hãy sử dụng
`read_file
` để xem toàn bộ bối cảnh xung quanh các thay đổi - chỉ riêng các khác biệt có thể bỏ sót các vấn đề chỉ hiển thị với mã xung quanh.

### Bước 5: Chạy kiểm tra tự động cục bộ (nếu có)

``` bash

# Run tests if there's a test suite
Python -m pytest 2>&1 | tail -20
# or: npm test, cargo test, go test ./..., etc.

# Run linter if configured
ruff check . 2>&1 | head -30
# or: eslint, CLIppy, etc.

`

### Bước 6: Áp dụng danh sách kiểm tra đánh giá (Phần 3)

Đi qua từng danh mục: Tính chính xác, Bảo mật, Chất lượng mã, Kiểm tra, Hiệu suất, Tài liệu.

### Bước 7: Đăng đánh giá lên GitHub

Thu thập những phát hiện của bạn và gửi chúng dưới dạng đánh giá chính thức kèm theo nhận xét nội tuyến.

**Với gh:**

`
``` bash

# If no issues — approve
gh pr review $PR_NUMBER --approve --body "Reviewed by Hermes Agent. Code looks clean — good test coverage, no security concerns."

# If issues found — request changes with inline comments
gh pr review $PR_NUMBER --request-changes --body "Found a few issues — see inline comments."

`
``**Với tính năng cuộn tròn — đánh giá nguyên tử với nhiều nhận xét nội tuyến:**

`
``` bash
HEAD_SHA=$(curl -s -H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER \
| Python3 -c "import sys,JSON; print(JSON.load(sys.stdin)['head']['sha'])")

# Build the review JSON — event is APPROVE, REQUEST_CHANGES, or COMMENT
curl -s -X POST \

-H "Authorization: token $GitHub_TOKEN" \
https://API.GitHub.com/repos/$GH_OWNER/$GH_REPO/pulls/$PR_NUMBER/reviews \
-d "{
\"commit_id\": \"$HEAD_SHA\",
\"event\": \"REQUEST_CHANGES\",
\"body\": \"## Hermes Agent Review\n\nFound 2 issues, 1 suggestion. See inline comments.\",
\"comments\": [
\{\"path\": \"src/auth.py\", \"line\": 45, \"body\": \"🔴 **Critical:** User input passed directly to SQL query — use parameteriZed queries.\"},
\{\"path\": \"src/models.py\", \"line\": 23, \"body\": \"⚠️ **Warning:** Password stored without hashing.\"},
\{\"path\": \"src/utils.py\", \"line\": 8, \"body\": \"💡 **Suggestion:** This duplicates logic in core/utils.py:34.\"}
]
}"

`

### Bước 8: Đồng thời đăng bình luận tóm tắt

Ngoài các nhận xét nội tuyến, hãy để lại một bản tóm tắt cấp cao nhất để tác giả PR có được bức tranh toàn cảnh trong nháy mắt. Sử dụng định dạng đầu ra đánh giá từ
`references/review-output-template.md

.

**Với gh:**

`
``` bash
gh pr comment $PR_NUMBER --body "$(cat `<<\'EOF\'

## Code Review Summary`**Verdict: Changes Requested** (2 issues, 1 suggestion)

### 🔴 Critical
- **src/auth.py:45** — SQL injection vulnerability

### ⚠️ Warnings
- **src/models.py:23** — Plaintext password storage

### 💡 Suggestions
- **src/utils.py:8** — Duplicated logic, consider consolidating

### ✅ Looks Good
- Clean API design
- Good error handling in the middleware layer

---
*Reviewed by Hermes Agent*
EOF
)"

`

### Bước 9: Dọn dẹp

``` bash
git checkout main
git branch -D pr-$PR_NUMBER

`

### Quyết định: Phê duyệt so với Yêu cầu thay đổi so với Nhận xét
- **Phê duyệt** — không có vấn đề nghiêm trọng hoặc ở mức cảnh báo, chỉ có những đề xuất nhỏ hoặc tất cả đều rõ ràng

- **Yêu cầu thay đổi** — mọi vấn đề nghiêm trọng hoặc ở mức cảnh báo cần được khắc phục trước khi hợp nhất
- **Nhận xét** — quan sát và đề xuất, nhưng không có gì cản trở (sử dụng khi bạn không chắc chắn hoặc PR chỉ là bản nháp)