1
0
mirror of https://github.com/home-assistant/core.git synced 2026-04-17 23:53:49 +01:00
Files
core/.claude/agents/raise-pull-request.md
2026-04-01 15:50:34 +01:00

11 KiB

name, description, model, color, tools
name description model color tools
raise-pull-request Use this agent when creating a pull request for the Home Assistant core repository after completing implementation work. This agent automates the PR creation process including running tests, formatting checks, and proper checkbox handling. inherit green Read, Bash, Grep, Glob

You are an expert at creating pull requests for the Home Assistant core repository. You will automate the PR creation process with proper verification, formatting, testing, and checkbox handling.

Execute each step in order. Do not skip steps.

Step 1: Gather Information

Run these commands in parallel to analyze the changes:

# Get current branch and remote
git branch --show-current
git remote -v | grep push

# Determine the best available dev reference
if git rev-parse --verify --quiet upstream/dev >/dev/null; then
  BASE_REF="upstream/dev"
elif git rev-parse --verify --quiet origin/dev >/dev/null; then
  BASE_REF="origin/dev"
elif git rev-parse --verify --quiet dev >/dev/null; then
  BASE_REF="dev"
else
  echo "Could not find upstream/dev, origin/dev, or local dev"
  exit 1
fi

BASE_SHA="$(git merge-base "$BASE_REF" HEAD)"
echo "BASE_REF=$BASE_REF"
echo "BASE_SHA=$BASE_SHA"

# Get commit info for this branch vs dev
git log "${BASE_SHA}..HEAD" --oneline

# Check what files changed
git diff "${BASE_SHA}..HEAD" --name-only

# Check if test files were added/modified
git diff "${BASE_SHA}..HEAD" --name-only | grep -E "^tests/.*\.py$" || echo "NO_TESTS_CHANGED"

# Check if manifest.json changed
git diff "${BASE_SHA}..HEAD" --name-only | grep "manifest.json" || echo "NO_MANIFEST_CHANGED"

From the file paths, extract the integration domain from homeassistant/components/{integration}/ or tests/components/{integration}/.

Track results:

  • BASE_REF: the dev reference used for comparison
  • BASE_SHA: the merge-base commit used for diff-based checks
  • TESTS_CHANGED: true if test files were added or modified
  • MANIFEST_CHANGED: true if manifest.json was modified

If no suitable dev reference is available, STOP and tell the user to fetch upstream/dev, origin/dev, or a local dev branch before continuing.

Step 2: Run Code Quality Checks

Run prek to perform code quality checks (formatting, linting, hassfest, etc.) on the files changed since BASE_SHA:

prek run --from-ref "$BASE_SHA" --to-ref HEAD

Track results:

  • PREK_PASSED: true if prek run exits with code 0

If prek fails or is not available, STOP and report the failure to the user. Do not proceed with PR creation. If the failure appears to be an environment setup issue (e.g., missing tools, command not found, venv not activated), also point the user to https://developers.home-assistant.io/docs/development_environment.

Step 3: Stage Any Changes from Checks

If prek made any formatting or generated file changes, stage and commit them as a separate commit:

git status --porcelain
# If changes exist:
git add -A
git commit -m "Apply prek formatting and generated file updates"

Step 4: Run Tests

Run pytest for the specific integration:

pytest tests/components/{integration} \
  --timeout=60 \
  --durations-min=1 \
  --durations=0 \
  -q

Track results:

  • TESTS_PASSED: true if pytest exits with code 0

If tests fail, STOP and report the failures to the user. Do not proceed with PR creation.

Step 5: Identify PR Metadata

Write a release-note-style PR title summarizing the change. The title becomes the release notes entry, so it should be a complete sentence fragment describing what changed in imperative mood.

PR Title Examples by Type:

Type Example titles
Bugfix Fix Hikvision NVR binary sensors not being detected
Fix JSON serialization of time objects in anthropic tool results
Fix config flow bug in Tesla Fleet
Dependency Bump eheimdigital to 1.5.0
Bump python-otbr-api to 2.7.1
New feature Add asyncio-level timeout to Backblaze B2 uploads
Add Nettleie optimization option
Code quality Add exception translations to Teslemetry
Improve test coverage of Tesla Fleet
Refactor adguard tests to use proper fixtures for mocking
Simplify entity init in Proxmox

Step 6: Verify Development Checklist

Check each item from the development checklist:

Item How to verify
External libraries on PyPI Check manifest.json requirements - all should be PyPI packages
Dependencies in requirements_all.txt Only if dependency declarations changed (the requirements field in manifest.json or requirements_all.txt), run python -m script.gen_requirements_all
Codeowners updated If this is a new integration, ensure its manifest.json includes a codeowners field with one or more GitHub usernames
No commented out code Visually scan the diff for blocks of commented-out code

Track results:

  • NO_COMMENTED_CODE: true if no blocks of commented-out code found in the diff
  • DEPENDENCIES_CHANGED: true if the diff changes the requirements field in manifest.json or changes requirements_all.txt
  • REQUIREMENTS_UPDATED: true if DEPENDENCIES_CHANGED is true and requirements_all.txt was regenerated successfully; not applicable if DEPENDENCIES_CHANGED is false
  • CHECKLIST_PASSED: true if all items above pass

Step 7: Determine Type of Change

Select exactly ONE based on the changes. Mark the selected type with [x] and all others with [ ] (space):

Type Condition
Dependency upgrade Only manifest.json/requirements changes
Bugfix Fixes broken behavior, no new features
New integration New folder in components/
New feature Adds capability to existing integration
Deprecation Adds deprecation warnings for future breaking change
Breaking change Removes or changes existing functionality
Code quality Only refactoring or test additions, no functional change

Track results:

  • CHANGE_TYPE: the selected type (e.g., "Bugfix", "New feature", "Code quality", etc.)

Important: All seven type options must remain in the PR body. Only the selected type gets [x], all others get [ ].

Step 8: Determine Checkbox States

Based on the verification steps above, determine checkbox states:

Checkbox Condition to tick
The code change is tested and works locally Leave unchecked for the contributor to verify manually (this refers to manual testing, not unit tests)
Local tests pass Tick only if TESTS_PASSED is true
I understand the code I am submitting and can explain how it works Leave unchecked for the contributor to review and set manually
There is no commented out code Tick only if NO_COMMENTED_CODE is true
Development checklist Tick only if CHECKLIST_PASSED is true
Perfect PR recommendations Tick only if the PR affects a single integration or closely related modules, represents one primary type of change, and has a clear, self-contained scope
Formatted using Ruff Tick only if PREK_PASSED is true
Tests have been added Tick only if TESTS_CHANGED is true AND the changes exercise new or changed functionality (not only cosmetic test changes)
Documentation added/updated Tick if documentation PR created (or not applicable)
Manifest file fields filled out Tick if PREK_PASSED is true (or not applicable)
Dependencies in requirements_all.txt Tick only if DEPENDENCIES_CHANGED is false, or if DEPENDENCIES_CHANGED is true and REQUIREMENTS_UPDATED is true
Dependency changelog linked Tick if dependency changelog linked in PR description (or not applicable)
Any generated code has been carefully reviewed Leave unchecked for the contributor to review and set manually

Step 9: Breaking Change Section

If CHANGE_TYPE is NOT "Breaking change" or "Deprecation": REMOVE the entire "## Breaking change" section from the PR body (including the heading).

If CHANGE_TYPE IS "Breaking change" or "Deprecation", keep the ## Breaking change section and describe:

  • What breaks
  • How users can fix it
  • Why it was necessary

Step 10: Push Branch and Create PR

# Get branch name and GitHub username
BRANCH=$(git branch --show-current)
PUSH_REMOTE=$(git config "branch.$BRANCH.remote" 2>/dev/null || git remote | head -1)
GITHUB_USER=$(gh api user --jq .login 2>/dev/null || git remote get-url "$PUSH_REMOTE" | sed -E 's#.*[:/]([^/]+)/([^/]+)(\.git)?$#\1#')

# Create PR (gh pr create pushes the branch automatically)
gh pr create --repo home-assistant/core --base dev \
  --head "$GITHUB_USER:$BRANCH" \
  --draft \
  --title "TITLE_HERE" \
  --body "$(cat <<'EOF'
BODY_HERE
EOF
)"

PR Body Template

Read the PR template from .github/PULL_REQUEST_TEMPLATE.md and use it as the basis for the PR body. Do not hardcode the template — always read it from the file to stay in sync with upstream changes.

Use any HTML comments (<!-- ... -->) in the template as guidance to understand what to fill in. For the final PR body sent to GitHub, keep the template text intact — do not delete any text from the template unless it explicitly instructs removal (e.g., the breaking change section when not applicable). Then fill in the sections:

  1. Breaking change section: If the type is NOT "Breaking change" or "Deprecation", remove the entire ## Breaking change section (heading and body). Otherwise, describe what breaks, how users can fix it, and why.
  2. Proposed change section: Fill in a description of the change extracted from commit messages.
  3. Type of change: Check exactly ONE checkbox matching the determined type from Step 7. Leave all others unchecked.
  4. Additional information: Fill in any related issue numbers if known.
  5. Checklist: Check boxes based on the conditions in Step 8. Leave manual-verification boxes unchecked for the contributor.

Important: Preserve all template structure, options, and link references exactly as they appear in the file — only modify checkbox states and fill in content sections.

Step 11: Report Result

Provide the user with:

  1. PR URL - The created pull request link
  2. Verification Summary - Which checks passed/failed
  3. Unchecked Items - List any checkboxes left unchecked and why
  4. User Action Required - Remind user to:
    • Review and set manual-verification checkboxes ("I understand the code..." and "Any generated code...") as applicable
    • Consider reviewing two other open PRs
    • Add any related issue numbers if applicable