release: v1.26.1-moko.06.06.02 #522

Merged
jmiller merged 2 commits from rc/v1.26.1-moko.06.06.02 into main 2026-06-06 17:41:18 +00:00
+54 -3
View File
@@ -431,7 +431,7 @@ server.tool(
server.tool(
'gitea_issue_create',
'Create a new issue',
'Create or update an issue (searches by title first to prevent duplicates)',
{
...OwnerRepo,
title: z.string().describe('Issue title'),
@@ -439,15 +439,66 @@ server.tool(
labels: z.array(z.number()).optional().describe('Label IDs'),
milestone: z.number().optional().describe('Milestone ID'),
assignees: z.array(z.string()).optional().describe('Usernames to assign'),
status_id: z.number().optional().describe('Custom status definition ID'),
priority_id: z.number().optional().describe('Custom priority definition ID'),
...ConnectionParam,
},
async ({ owner, repo, title, body: issueBody, labels, milestone, assignees, connection }) => {
async ({ owner, repo, title, body: issueBody, labels, milestone, assignees, status_id, priority_id, connection }) => {
const c = clientFor(connection);
// Search for existing issue with same title to prevent duplicates
const searchRes = await c.get(`/repos/${owner}/${repo}/issues`, {
type: 'issues', state: 'open', limit: '50',
});
let existing: { number: number } | undefined;
if (searchRes.status < 400 && Array.isArray(searchRes.data)) {
existing = (searchRes.data as Array<{ number: number; title: string }>)
.find((i) => i.title === title);
}
// Also check closed issues if not found in open
if (!existing) {
const closedRes = await c.get(`/repos/${owner}/${repo}/issues`, {
type: 'issues', state: 'closed', limit: '50',
});
if (closedRes.status < 400 && Array.isArray(closedRes.data)) {
existing = (closedRes.data as Array<{ number: number; title: string }>)
.find((i) => i.title === title);
}
}
if (existing) {
// Update existing issue instead of creating a duplicate
const body: Record<string, unknown> = {};
if (issueBody !== undefined) body.body = issueBody;
if (labels) body.labels = labels;
if (milestone) body.milestone = milestone;
if (assignees) body.assignees = assignees;
const res = await c.patch(`/repos/${owner}/${repo}/issues/${existing.number}`, body);
// Set status/priority via dedicated endpoints
const issueData = res.data as { id?: number };
if (issueData?.id) {
if (status_id !== undefined) await c.post(`/repos/${owner}/${repo}/issues/${issueData.id}/custom-status`, { status_id });
if (priority_id !== undefined) await c.post(`/repos/${owner}/${repo}/issues/${issueData.id}/custom-priority`, { priority_id });
}
const out = formatResponse(res);
out.content[0].text = `Updated existing issue #${existing.number} (duplicate prevented)\n${out.content[0].text}`;
return out;
}
// No duplicate found - create new
const body: Record<string, unknown> = { title };
if (issueBody) body.body = issueBody;
if (labels) body.labels = labels;
if (milestone) body.milestone = milestone;
if (assignees) body.assignees = assignees;
return formatResponse(await clientFor(connection).post(`/repos/${owner}/${repo}/issues`, body));
const res = await c.post(`/repos/${owner}/${repo}/issues`, body);
// Set status/priority via dedicated endpoints
const newIssue = res.data as { id?: number };
if (newIssue?.id) {
if (status_id !== undefined) await c.post(`/repos/${owner}/${repo}/issues/${newIssue.id}/custom-status`, { status_id });
if (priority_id !== undefined) await c.post(`/repos/${owner}/${repo}/issues/${newIssue.id}/custom-priority`, { priority_id });
}
return formatResponse(res);
},
);