Issue-to-PR Resolver
Implement GitHub issue #$ARGUMENTS in homeassistant-ai/ha-mcp end-to-end.
Phase 1: Setup
Read the issue:
bashgh issue view "$ARGUMENTS" --repo homeassistant-ai/ha-mcp --json title,body,labels,comments,author
Create a worktree from repo root:
bashcd "$(git rev-parse --show-toplevel)" git checkout master && git pull origin master git worktree add "worktree/issue-$ARGUMENTS" -b "feature/issue-$ARGUMENTS" git -C "worktree/issue-$ARGUMENTS" submodule update --init --recursive cd "worktree/issue-$ARGUMENTS"
Phase 2: Implement
- Analyze codebase structure and patterns before writing code
- Follow project conventions (see
AGENTS.mdfor patterns, naming, error handling) - Write tests — all new MCP tools in
src/ha_mcp/tools/need E2E tests - Make atomic, well-described commits using conventional commit prefixes
Philosophy: Work autonomously. Don't ask about every small decision. Fix unrelated test failures encountered. Document all choices for the final summary.
If a non-obvious choice has significant consequences, present the available options to the user and let them choose.
Phase 3: Create PR
Write the PR body to local/pr-body-$ARGUMENTS.md first. local/ is git-ignored, so a new worktree does not have it; create it with mkdir -p local if it does not exist. Build the body from .github/pull_request_template.md: keep its headings, put Closes #$ARGUMENTS and the description under ## What does this PR do?, and delete ## Future improvements unless the user has confirmed work to defer. Then push and create the PR:
bashgit push -u origin "feature/issue-$ARGUMENTS" PR_NUMBER=$(gh pr create --draft \ --repo homeassistant-ai/ha-mcp \ --title "<descriptive title>" \ --body-file "local/pr-body-$ARGUMENTS.md" | grep -oE '[0-9]+$')
Wait for CI:
bashgh pr checks "$PR_NUMBER" --repo homeassistant-ai/ha-mcp --watch
Before marking ready (gh pr ready), update the PR description to reflect all changes made.
Phase 4: Resolution Loop
Repeat until all checks green and no unresolved threads:
Check for issues:
bashgh pr checks "$PR_NUMBER" --repo homeassistant-ai/ha-mcp gh api repos/homeassistant-ai/ha-mcp/pulls/"$PR_NUMBER"/comments \ --jq '.[] | {id, path, line, author: .user.login, body}' gh api graphql -F pr="$PR_NUMBER" -f query='query($pr: Int!) { repository(owner:"homeassistant-ai", name:"ha-mcp") { pullRequest(number:$pr) { reviewThreads(first:100) { nodes { id isResolved comments(first:1) { nodes { databaseId body } } } } } } }'
Resolve each comment (both steps required):
bash# 1. Reply on the inline thread gh api repos/homeassistant-ai/ha-mcp/pulls/"$PR_NUMBER"/comments/<COMMENT_ID>/replies \ -f body="✅ Fixed in [commit]. [explanation]" # or: -f body="📝 Not addressing because [reason]." # 2. Resolve the thread via GraphQL gh api graphql -f query='mutation($threadId: ID!) { resolveReviewThread(input: {threadId: $threadId}) { thread { id isResolved } } }' \ -f threadId="<PRRT_...>"
After pushing fixes, wait and re-check:
bashgh pr checks "$PR_NUMBER" --repo homeassistant-ai/ha-mcp --watch
Phase 5: Final Report
Once all checks pass and all threads resolved:
bashgh pr comment "$PR_NUMBER" --repo homeassistant-ai/ha-mcp --body "## Implementation Summary **Choices Made:** - [key technical decisions with rationale] **Problems Encountered:** - [issues faced and how resolved] - [unrelated test failures fixed, if any] "
Report to user: PR number, status, key choices.
Rules
- Never commit to master — always work in the worktree
- Always create PRs as draft — never mark ready without user request
- Maximum 5 resolution iterations before reporting blockers
- Discovered improvements: fix-in-place by default. See AGENTS.md § Boy Scout Rule — Handling Discovered Improvements for the full rubric. Never open a follow-up PR or issue without explicit user approval; never populate
## Future improvementswithout the user explicitly confirming the work is out of scope.


