feat: complete label management (name->id resolution, update/remove)
Resolves the long-standing problem that label tools passed names while Gitea's API requires numeric label ids. - gitea_client: add _resolve_label_ids() helper; create_issue and add_labels now resolve label names to ids (case-insensitive) and raise a clear "Unknown label(s)" error instead of a generic 500. - New tools: remove_labels (by name) and update_label (located by current name). - Register both write tools and document the name-based label contract. - Tests: resolver mapping + unknown-label error, add_labels id translation, update_label and remove_labels handlers. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -230,6 +230,29 @@ class CreateLabelArgs(RepositoryArgs):
|
||||
exclusive: bool = Field(default=False)
|
||||
|
||||
|
||||
class UpdateLabelArgs(RepositoryArgs):
|
||||
"""Arguments for update_label (located by current name)."""
|
||||
|
||||
name: str = Field(..., min_length=1, max_length=50)
|
||||
new_name: str | None = Field(default=None, min_length=1, max_length=50)
|
||||
color: str | None = Field(default=None, pattern=r"^#?[0-9A-Fa-f]{6}$")
|
||||
description: str | None = Field(default=None, max_length=1000)
|
||||
|
||||
@model_validator(mode="after")
|
||||
def require_change(self) -> UpdateLabelArgs:
|
||||
"""Require at least one mutable field in the update payload."""
|
||||
if self.new_name is None and self.color is None and self.description is None:
|
||||
raise ValueError("At least one of new_name, color, or description must be provided")
|
||||
return self
|
||||
|
||||
|
||||
class RemoveLabelsArgs(RepositoryArgs):
|
||||
"""Arguments for remove_labels."""
|
||||
|
||||
issue_number: int = Field(..., ge=1)
|
||||
labels: list[str] = Field(..., min_length=1, max_length=20)
|
||||
|
||||
|
||||
def extract_repository(arguments: dict[str, object]) -> str | None:
|
||||
"""Extract `owner/repo` from raw argument mapping.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user