Review a contribution PR for safety, quality, and readiness. Checks for security concerns, test coverage, size appropriateness, and intent alignment. Use when reviewing external contributions.
Review PR #$ARGUMENTS from external contributor for safety, quality, and readiness.
PR Metadata:
!`gh pr view $ARGUMENTS --repo homeassistant-ai/ha-mcp --json author,additions,deletions,files,commits,closingIssuesReferences,isDraft,reviews,url,title,body`
Contributor Stats:
!`gh api /repos/homeassistant-ai/ha-mcp/pulls/$ARGUMENTS --jq '{author: .user.login, user_id: .user.id}' | jq -r '.author' | xargs -I {} gh api /repos/homeassistant-ai/ha-mcp/contributors --jq '.[] | select(.login == "{}") | {login: .login, contributions: .contributions}'`
Files Changed:
!`gh api /repos/homeassistant-ai/ha-mcp/pulls/$ARGUMENTS/files --jq '.[] | {filename: .filename, status: .status, additions: .additions, deletions: .deletions, changes: .changes, patch: .patch}' | head -50`
Note: Codex (chatgpt-codex-connector[bot]) and CodeRabbit (coderabbitai[bot]) both review PRs automatically. Check whether either flagged security concerns.
# Check both bots' reviews and any security-related comments.
# Their findings can be inline-only, so also fetch the pull review comments
# endpoint โ review bodies and conversation comments alone can miss them.
# --paginate: both endpoints page at 30, and an iterating PR outruns that.
gh api --paginate /repos/homeassistant-ai/ha-mcp/pulls/$ARGUMENTS/reviews --jq '.[] | select(.user.login == "chatgpt-codex-connector[bot]" or .user.login == "coderabbitai[bot]") | {author: .user.login, state: .state, body: .body}'
gh api --paginate /repos/homeassistant-ai/ha-mcp/pulls/$ARGUMENTS/comments --jq '.[] | select(.user.login == "chatgpt-codex-connector[bot]" or .user.login == "coderabbitai[bot]") | {author: .user.login, path: .path, line: .line, body: .body}'
# CodeRabbit posts its walkthrough and summary as a top-level comment, which
# neither endpoint above returns โ fetch that channel by author too.
gh api --paginate /repos/homeassistant-ai/ha-mcp/issues/$ARGUMENTS/comments --jq '.[] | select(.user.login == "chatgpt-codex-connector[bot]" or .user.login == "coderabbitai[bot]") | {author: .user.login, body: .body}'
# Keyword scan stays, for humans raising security concerns in conversation.
gh pr view $ARGUMENTS --repo homeassistant-ai/ha-mcp --json comments --jq '.comments[] | select(.body | contains("security") or contains("Security")) | {author: .author.login, body: .body}'
If either bot flagged security issues:
If NO bot security flags but you notice concerning patterns:
.github/ workflow modifications with pull_request_target.claude/ agent/skill changes that could affect behaviorIf security assessment passes and PR has workflow changes or new workflows:
# Check current workflow status
gh api /repos/homeassistant-ai/ha-mcp/pulls/$ARGUMENTS/requested_reviewers
# Enable workflows if not enabled (requires WRITE permission)
# This command may fail if already enabled - that's OK
gh api -X PUT /repos/homeassistant-ai/ha-mcp/actions/workflows/pr.yml/enable 2>/dev/null || echo "Workflows already enabled or no permission"
Pre-existing tests (easier review if modified code is already tested):
# For each modified source file, check if tests exist
gh api /repos/homeassistant-ai/ha-mcp/pulls/$ARGUMENTS/files --jq '.[] | select(.filename | startswith("src/")) | .filename' | while read file; do
basename=$(basename "$file" .py)
echo "Checking tests for: $file"
# Method 1: Look for test files by naming convention
find tests/ -name "test_${basename}.py" -o -name "test_*${basename}*.py" 2>/dev/null | head -3
# Method 2: Grep for function/class names from the modified file
# Extract function/class names and search for them in tests
grep -E '^(def|class|async def) [a-zA-Z_]' "$file" 2>/dev/null | head -5 | while read line; do
name=$(echo "$line" | sed -E 's/.*(def|class) ([a-zA-Z_][a-zA-Z0-9_]*).*/\2/')
if [ -n "$name" ]; then
grep -r "$name" tests/ 2>/dev/null | head -1
fi
done
done
New tests added:
# Check if PR adds or modifies tests
gh api /repos/homeassistant-ai/ha-mcp/pulls/$ARGUMENTS/files --jq '.[] | select(.filename | startswith("tests/")) | {filename: .filename, status: .status, additions: .additions}'
Output Test Summary:
๐งช Test Coverage:
- Pre-existing tests: โ
Modified code has tests / โ ๏ธ No tests for modified code
- New tests: โ
PR adds X test files / โ ๏ธ No new tests
- Assessment: [Easy/Medium/Hard to review based on test coverage]
Calculate PR size and assess appropriateness:
# From metadata: additions + deletions
total_lines=$(gh pr view $ARGUMENTS --repo homeassistant-ai/ha-mcp --json additions,deletions --jq '.additions + .deletions')
echo "Total lines changed: $total_lines"
# Get contributor experience
author=$(gh pr view $ARGUMENTS --repo homeassistant-ai/ha-mcp --json author --jq -r '.author.login')
# Check 1: Contributions to this project
project_contributions=$(gh api /repos/homeassistant-ai/ha-mcp/contributors --jq ".[] | select(.login == \"$author\") | .contributions" || echo "0")
# Check 2: Total GitHub commits (overall experience)
total_commits=$(gh api /users/$author --jq '.public_repos + .total_private_repos' 2>/dev/null || echo "unknown")
echo "Contributor: $author"
echo "Project contributions: $project_contributions"
echo "GitHub experience: $total_commits repos"
Assess:
First-time to project (0-2 project contributions):
500 lines: ๐ด Too large - suggest splitting
Regular contributor (3+ project contributions):
1000 lines: ๐ด Very large - suggest splitting
Experienced GitHub user (many repos/commits overall):
Output Size Summary:
๐ PR Size:
- Lines changed: [total]
- Contributor: [first-time / regular] ([X] contributions)
- Assessment: [size appropriateness]
Check linked issues:
# From metadata: closingIssuesReferences
gh pr view $ARGUMENTS --repo homeassistant-ai/ha-mcp --json closingIssuesReferences --jq '.closingIssuesReferences[] | {number: .number, title: .title}'
If issue linked:
If no issue linked:
Output Intent Summary:
๐ฏ Intent & Linkage:
- Linked issue: #X "title" / โ ๏ธ No issue linked
- Solves issue: โ
Fully addresses requirements / โ ๏ธ Partial / โ Doesn't match
- Scope: โ
Focused / โ ๏ธ Scope creep detected
Note: Codex and CodeRabbit provide automated code review on all PRs. This step focuses on what they cannot assess:
Breaking change assessment:
Quick checks:
# ruff and mypy run as steps of the "Fast Checks" job
gh pr checks $ARGUMENTS --repo homeassistant-ai/ha-mcp | grep "Fast Checks"
# Check for common issues in diff
gh pr diff $ARGUMENTS --repo homeassistant-ai/ha-mcp | grep -E "(TODO|FIXME|XXX|HACK)"
Output Quality Summary:
โจ Code Quality:
- Architecture fit: [assessment - service layer, context engineering]
- Breaking changes: โ
None / โ ๏ธ Detected - [describe what's genuinely lost]
- Bot reviews: [check if Codex or CodeRabbit flagged anything critical]
After completing all steps, present a short summary of what the PR does and the review findings, then ask: "Should I post this comment to the PR?"
After completing the analysis, draft a comment for the PR following these guidelines:
Comment Length: The contributor should be able to read it in one pass: what works, what must change, and what happens next. A good-to-merge comment is shorter than a changes-needed one.
Style:
Structure for "Good to Merge":
[Positive opening line about the contribution]
[What works well - focus on functionality, tests, architecture]
[Any minor suggestions or notes - optional, technical only]
[Closing line about readiness to merge]
Note: Do NOT mention security assessment in comment unless issues were found. Security checks are internal.
Structure for "Changes Needed":
[Positive opening line acknowledging the work]
[Brief summary of the issue being solved]
**[Concern 1]:**
[Short explanation + suggestion - focus on: tests, functionality, architecture, breaking changes]
**[Concern 2]:** (if applicable)
[Short explanation + suggestion]
**[Concern 3]:** (if applicable)
[Short explanation + suggestion]
[Closing line about next steps]
Note: Raise security concerns with the user as soon as they are found, not in the final structured comment.
Illustrative example - Good to Merge (match the wording to the PR, not to this text):
Thanks for [feature/fix]. [One specific thing it gets right].
The implementation follows existing patterns and the [specific aspect] is well-designed. [Optional: Minor note about something noticed].
Ready to merge once CI passes.
Illustrative example - Changes Needed (match the wording to the PR, not to this text):
Thanks for tackling [problem]. [Metric/impact] shows this addresses a real need.
**Test coverage:**
Missing tests for the new [feature]. Please add a unit test for its logic, and an E2E test for a new tool or for its wiring or Home Assistant behaviour. Performance tests not required.
**[Second concern if applicable]:**
[Brief explanation and request]
Once [change 1] and [change 2] are addressed, this should be good to merge.