import type { Context } from "hono"; import type { IssueEvent, TaskRequest } from "../types.js"; import type { TaskQueue } from "../queue.js"; import type { Config } from "../config.js"; const LABEL_TO_TASK: Record = { "ready-for-architecture": "architect", "ready-for-development": "develop", "ready-for-testing": "test", "ready-for-deployment": "devops", }; /** Tasks that should use the review bot account. */ const REVIEW_TASKS = new Set(["test"]); /** * Issue labeled → SDLC stage transition. * * Replaces: issue-stage-transition.json */ export function issueLabel(config: Config, queue: TaskQueue) { return async (c: Context) => { const event = await c.req.json(); console.log(`[issue-label] action="${event.action}" issue=#${event.issue.number} labels=[${event.issue.labels.map((l) => l.name).join(", ")}]`); if (!["labeled", "label_updated", "created"].includes(event.action)) { return c.text("ignored: not a label event", 200); } const labels = event.issue.labels.map((l) => l.name); const [org, repo] = event.repository.full_name.split("/"); let taskType: string | null = null; for (const [label, task] of Object.entries(LABEL_TO_TASK)) { if (labels.includes(label)) { taskType = task; break; } } if (!taskType) { return c.text("ignored: no matching stage label", 200); } const giteaToken = REVIEW_TASKS.has(taskType) ? config.giteaReviewToken : config.giteaDevToken; const task: TaskRequest = { taskType, issueNumber: event.issue.number, giteaOrg: org, giteaRepo: repo, repoCloneUrl: event.repository.clone_url, giteaToken, }; const queued = await queue.enqueue(task, { useReviewAccount: false, body: `🤖 SDLC stage transition: **${taskType}** — workspace queued.`, }); return c.json({ ok: true, queued }); }; }