feat(hive-forge): add pr-merge verb (#1670)

Adds `hive-forge pr-merge <n> [--method merge|rebase] [--keep-branch]
[--force]` wrapping POST /repos/{owner}/{repo}/pulls/{n}/merge, so agents on
the peer-review-and-merge workflow have a CLI path instead of the raw API.

- Methods: merge (default) | rebase. Squash is intentionally not offered.
- Deletes the head branch after merge unless --keep-branch.
- Safe by default: refuses unless the PR is mergeable, CI is not red, and no
  review's current verdict requests changes (latest-per-reviewer wins, so a
  later approval clears an earlier request-changes). --force overrides and
  also sets Forgejo's force_merge.
- New client helper post_no_content for the 200-empty-body merge response.
This commit is contained in:
atlas 2026-06-15 09:54:33 +02:00 committed by mara
commit 9d8367bb24
5 changed files with 231 additions and 0 deletions

View file

@ -95,6 +95,10 @@ enum Verb {
List(verbs::list::Args),
/// Manage milestones (list / create / close).
Milestone(verbs::milestone::Args),
/// Merge a PR (`--method merge|rebase`, default merge). Refuses unless
/// mergeable + CI not red + no changes requested (`--force` overrides).
/// Deletes the head branch unless `--keep-branch`. No squash option.
PrMerge(verbs::pr_merge::Args),
/// List reviews on a PR.
PrReviews(verbs::pr_reviews::Args),
/// List branches, optionally filtered.
@ -142,6 +146,7 @@ fn main() -> Result<()> {
Verb::Lint(a) => verbs::lint::run(&client, a),
Verb::List(a) => verbs::list::run(&client, a),
Verb::Milestone(a) => verbs::milestone::run(&client, a),
Verb::PrMerge(a) => verbs::pr_merge::run(&client, a),
Verb::PrReviews(a) => verbs::pr_reviews::run(&client, a),
Verb::Branches(a) => verbs::branches::run(&client, a),
Verb::TreeSha(a) => verbs::tree_sha::run(&client, a),