feat: expand MCP server tools for PR and label management, add helper CLI scripts

Closes #7
This commit is contained in:
2026-06-24 00:14:47 -04:00
parent 8b1c115647
commit 82fcd5a4bc
17 changed files with 901 additions and 5 deletions
Executable
+58
View File
@@ -0,0 +1,58 @@
#!/usr/bin/env python3
"""Merge a Gitea pull request.
Usage:
merge_pr.py --pr-number 84 --do squash --remote dadeschools
"""
import os
import sys
import json
import argparse
# Auto-execute using the project's local virtual environment Python
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
venv_python = os.path.join(PROJECT_ROOT, "venv", "bin", "python3")
if os.path.exists(venv_python) and sys.executable != venv_python:
os.execv(venv_python, [venv_python] + sys.argv)
from gitea_auth import get_auth_header, resolve_remote, add_remote_args, api_request, repo_api_url
def main(argv=None):
parser = argparse.ArgumentParser(description="Merge a Gitea pull request.")
add_remote_args(parser)
parser.add_argument("--pr-number", type=int, required=True, help="PR number/index to merge.")
parser.add_argument("--do", choices=["merge", "squash", "rebase"], default="merge",
help="Merge method/style (default: merge).")
parser.add_argument("--title", help="Optional merge title.")
parser.add_argument("--message", help="Optional merge message.")
parser.add_argument("--force", action="store_true", help="Force merge, ignoring status checks.")
args = parser.parse_args(argv)
host, org, repo = resolve_remote(args)
auth = get_auth_header(host)
if not auth:
print(f"Could not get credentials for {host}.", file=sys.stderr)
return 1
url = f"{repo_api_url(host, org, repo)}/pulls/{args.pr_number}/merge"
payload = {
"Do": args.do,
"force_merge": args.force,
}
if args.title:
payload["MergeTitleField"] = args.title
if args.message:
payload["MergeMessageField"] = args.message
try:
api_request("POST", url, auth, payload)
print(f"Successfully merged PR #{args.pr_number} using '{args.do}' method.")
return 0
except Exception as e:
print(f"Error merging PR #{args.pr_number}: {e}", file=sys.stderr)
return 1
if __name__ == "__main__":
sys.exit(main())