mirror of
https://github.com/anomalyco/opencode.git
synced 2026-05-25 13:54:52 +00:00
Switch triage agent to gpt-5.4-nano for faster issue assignment. Remove label management from the triage tool so it only assigns owners based on team ownership rules. This reduces noise in the issue tracker and ensures issues get to the right team member immediately without unnecessary labels. Update team structures to reflect current ownership and add script for processing unassigned issues.
59 lines
1.9 KiB
TypeScript
59 lines
1.9 KiB
TypeScript
/// <reference path="../env.d.ts" />
|
|
import { tool } from "@opencode-ai/plugin"
|
|
|
|
const TEAM = {
|
|
tui: ["kommander", "simonklee"],
|
|
desktop_web: ["Hona", "Brendonovich"],
|
|
core: ["jlongster", "rekram1-node", "nexxeln", "kitlangton"],
|
|
inference: ["fwang", "MrMushrooooom"],
|
|
windows: ["Hona"],
|
|
} as const
|
|
|
|
function pick<T>(items: readonly T[]) {
|
|
return items[Math.floor(Math.random() * items.length)]!
|
|
}
|
|
|
|
function getIssueNumber(): number {
|
|
const issue = parseInt(process.env.ISSUE_NUMBER ?? "", 10)
|
|
if (!issue) throw new Error("ISSUE_NUMBER env var not set")
|
|
return issue
|
|
}
|
|
|
|
async function githubFetch(endpoint: string, options: RequestInit = {}) {
|
|
const response = await fetch(`https://api.github.com${endpoint}`, {
|
|
...options,
|
|
headers: {
|
|
Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
|
|
Accept: "application/vnd.github+json",
|
|
"Content-Type": "application/json",
|
|
...(options.headers instanceof Headers ? Object.fromEntries(options.headers.entries()) : options.headers),
|
|
},
|
|
})
|
|
if (!response.ok) {
|
|
throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
|
|
}
|
|
return response.json()
|
|
}
|
|
|
|
export default tool({
|
|
description: `Use this tool to assign a GitHub issue.
|
|
|
|
Provide the team that should own the issue. This tool picks a random assignee from that team and does not apply labels.`,
|
|
args: {
|
|
team: tool.schema.enum(Object.keys(TEAM) as [keyof typeof TEAM, ...(keyof typeof TEAM)[]]).describe("The owning team"),
|
|
},
|
|
async execute(args) {
|
|
const issue = getIssueNumber()
|
|
const owner = "anomalyco"
|
|
const repo = "opencode"
|
|
const assignee = pick(TEAM[args.team])
|
|
|
|
await githubFetch(`/repos/${owner}/${repo}/issues/${issue}/assignees`, {
|
|
method: "POST",
|
|
body: JSON.stringify({ assignees: [assignee] }),
|
|
})
|
|
|
|
return `Assigned @${assignee} from ${args.team} to issue #${issue}`
|
|
},
|
|
})
|