OpenHarness pr-merge
This skill should be used when the user asks to "merge a PR", "review and merge pull requests", "integrate external contributions", "handle PR conflicts", "cherry-pick from a PR", or needs to merge GitHub PRs while maximizing contributor attribution.
install
source · Clone the upstream repo
git clone https://github.com/HKUDS/OpenHarness
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/HKUDS/OpenHarness "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/pr-merge" ~/.claude/skills/hkuds-openharness-pr-merge && rm -rf "$T"
manifest:
.claude/skills/pr-merge/SKILL.mdsource content
PR Merge — Contributor-First Pull Request Integration
Merge external pull requests while maximizing original author attribution. Core principle: merge first, resolve conflicts after — never rewrite a contributor's work from scratch.
Core Principles
- Preserve authorship — use
for clean PRs. For manual merges, usegh pr merge --squash
.--author="Name <email>" - Merge first, fix after — accept the PR's approach even if it differs from local style. Fix conflicts in a separate commit.
- Selective merge is OK — exclude files with
when a PR contains features already implemented locally. Document what was excluded.--exclude - Never
+ self-commit — this loses author attribution entirely.git apply
Workflow
1. Triage Open PRs
gh pr list --repo OWNER/REPO --state open \ --json number,title,author,additions,deletions,mergeable
Classify each PR: merge directly, merge with conflict resolution, selective merge, or close.
2. Merge Clean PRs via GitHub
Prefer
gh pr merge — preserves author automatically:
gh pr merge NUMBER --repo OWNER/REPO --squash \ --subject "feat: description (#NUMBER)"
3. Handle Conflicting PRs Locally
git fetch origin pull/NUMBER/head:pr-NUMBER git merge pr-NUMBER --no-edit # Resolve conflicts keeping both sides where possible git add -A && git commit --no-edit
4. Selective Merge (Skip Some Files)
When a PR contains features already implemented locally:
gh pr diff NUMBER --repo OWNER/REPO | \ git apply --exclude='path/to/skip.py' --exclude='CHANGELOG.md' git commit --author="Author Name <author@email>" \ -m "feat: description (#NUMBER) Cherry-picked from PR #NUMBER. Excluded: file.py (already implemented)."
5. Close Duplicate/Superseded PRs
gh pr close NUMBER --repo OWNER/REPO \ --comment "Fixed via PR #OTHER. Thank you for the contribution!"
6. Post-Merge Verification
python -m ruff check src/ tests/ # lint python -m pytest tests/ -q # unit tests git push origin main # push
Then run
harness-eval for end-to-end verification on an unfamiliar codebase.
Attribution Checklist
Before pushing a merged PR:
- Original author appears in
(viagit log
or GitHub squash merge)--author - Commit message references PR number (
)#NUMBER - If selectively merged, commit body explains exclusions
- Closed PRs have a comment thanking the contributor
- Duplicate PRs acknowledge the contributor's investigation
Common Pitfalls
+ self-commit loses authorgit apply- Rewriting from scratch instead of merging — merge their code, fix style after
- Force-pushing main after merge — may remove contributor commits
- Forgetting CHANGELOG conflicts — always exclude and handle manually
- Not testing after merge — clean merge doesn't mean working code
Additional Resources
Reference Files
— Detailed examples for each merge scenario (clean, conflicting, selective, duplicate)references/merge-scenarios.md