gitea-issues asserted flatly that a merge never closes an issue, contradicting gitea-prs' references/merging.md, which documents that closing keywords in commits landing on the default branch do close one. The qualifier that made the claim true had been deleted; both sides now agree. gitea-releases had lost an epistemic hedge and its verification step, leaving conventions.md asserting unconfirmed tag auto-creation as fact. Nothing in the research corpus sources it, so the hedge and the verify-afterward instruction are back rather than upgraded. Descriptions were cut 50-240 chars under the 400 budget and shed routing with them: gitea-workflow's boundary named no target, gitea-prs lost the issue/PR number-space directive the suite is built around at 163/400, gitea-releases lost its boundary and every trigger. Restored, inside budget. Also restores delete_branch's hard-refusal strength and gitea-files' Read/Write/Edit pointer. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EJJrm5YmacbwMdzZpXcoti
3.9 KiB
name, description, compatibility, metadata, allowed-tools
| name | description | compatibility | metadata | allowed-tools | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| gitea-labels-milestones | Use when reading or writing Gitea labels or milestones — "create a label", "what labels does this repo have", "close the milestone" — or to resolve label names to IDs, or infer a Kind/Priority/Status label from context, even when the user does not say "Gitea". Not applying them to an issue -> `gitea-issues`. Not to a PR -> `gitea-prs`. | Requires Gitea MCP server configured with write:issue and write:repository token scopes. |
|
Bash mcp__gitea__label_read mcp__gitea__label_write mcp__gitea__milestone_read mcp__gitea__milestone_write |
Gotchas
- Applying a label takes a numeric ID, but issue/PR responses slim labels down to name strings. An issue's existing labels yield no IDs — resolve name → ID with
label_read. pull_request_readreturnsmilestoneas a bare title string whereissue_readreturns{id, title}— recover the milestone's ID by listing milestones and matching the title.- Never assume a
Kind/*/Priority/*/Status/*scope is exclusive — read each label's ownexclusivefield.list_repo_labelsreturns it on every repo label, so it is always readable per label;label_writedocuments it as "(org only)" because it is only settable through the org create methods. Where it istrueGitea enforces one-per-scope itself, and replacing rather than stacking on a label whoseexclusiveisfalsedestroys a valid label.
Step 1 — Resolve owner, repo and org
Before any tool call, extract owner and repo from the git remote (skip this if an orchestrating caller already passed them in):
git remote get-url origin
If origin is not set or the URL is not a Gitea URL, stop and report: "No Gitea remote found — set origin to your Gitea instance URL."
The *_org_label* methods take org, not owner/repo. Pass that same owner as org — it is the org name whenever the owner is an organisation, and the remote URL does not say whether it is one.
Read the failure text before interpreting it. list_org_labels needs the read:organization token scope, which this skill's declared scopes (write:issue, write:repository) do not carry, so it fails with token does not have at least one of required scope(s), required=[read:organization] before it ever determines org-vs-user. Report that: the org pool went unchecked, not empty. Only a not-found response is evidence the owner is a user account with no org pool.
Step 2 — Dispatch
| Task | Tool | method |
|---|---|---|
| Resolve a label name to its ID | label_read |
"list_repo_labels", then "list_org_labels" |
| List repo labels | label_read |
"list_repo_labels" |
| Get one repo label by ID | label_read |
"get_repo_label" |
| List org labels | label_read |
"list_org_labels" |
| Create a repo/org label | label_write |
"create_repo_label" / "create_org_label" |
| Edit a repo/org label | label_write |
"edit_repo_label" / "edit_org_label" |
| Delete a repo/org label | label_write |
"delete_repo_label" / "delete_org_label" |
| List milestones | milestone_read |
"list" |
| Get one milestone by ID | milestone_read |
"get" |
| Create a milestone | milestone_write |
"create" |
| Update / close a milestone | milestone_write |
"update" |
| Delete a milestone | milestone_write |
"delete" |
Every list method paginates manually — per_page defaults to 30, so iterate page: 1, 2, ... until a page returns fewer results than per_page. A truncated list silently breaks name → ID resolution.
If the task is a label operation, read references/labels.md; if a milestone operation, read references/milestones.md. If the label to apply has to be derived from conversation context rather than named, read references/label-inference.md.