algoforge-mcp-server/handlers/collab.py

66 lines
2.2 KiB
Python
Raw Permalink Normal View History

from forgeclient import request
def _issue_summary(i):
return {
"number": i.get("number"),
"title": i.get("title"),
"state": i.get("state"),
"user": i.get("user", {}).get("login"),
"html_url": i.get("html_url"),
}
def list_issues(owner, repo, state="open"):
state = state if state in ("open", "closed", "all") else "open"
data = request("GET", f"/repos/{owner}/{repo}/issues", params={"state": state})
if isinstance(data, dict) and "error" in data:
return data
# The issues endpoint also returns pull requests; keep only true issues.
return [_issue_summary(i) for i in data if not i.get("pull_request")]
def create_issue(owner, repo, title, body=""):
i = request("POST", f"/repos/{owner}/{repo}/issues",
json={"title": title, "body": body})
if "error" in i:
return i
return _issue_summary(i)
def open_pull_request(owner, repo, title, head, base, body=""):
"""Open a pull request from `head` branch into `base` branch."""
pr = request("POST", f"/repos/{owner}/{repo}/pulls",
json={"title": title, "head": head, "base": base, "body": body})
if "error" in pr:
return pr
return {
"number": pr.get("number"),
"title": pr.get("title"),
"state": pr.get("state"),
"mergeable": pr.get("mergeable"),
"html_url": pr.get("html_url"),
}
def create_release(owner, repo, tag_name, name=None, body="", target="main",
draft=False, prerelease=False):
"""Tag a version of the project. Forgejo releases are Git tags with notes;
MQL5 has no package format, so this is used purely as a version marker."""
payload = {
"tag_name": tag_name,
"name": name or tag_name,
"body": body,
"target_commitish": target,
"draft": bool(draft),
"prerelease": bool(prerelease),
}
rel = request("POST", f"/repos/{owner}/{repo}/releases", json=payload)
if "error" in rel:
return rel
return {
"id": rel.get("id"),
"tag_name": rel.get("tag_name"),
"name": rel.get("name"),
"html_url": rel.get("html_url"),
}