Files
sdlc-orchestrator/src/handlers/issue-label.ts
T
Daniel SamsonandClaude Opus 4.6 f495ea391f
Publish Image / publish (push) Successful in 22s
Fix issue-label and pr-rework webhook handlers
- issue-label: Accept action "created" from Gitea (in addition to
  "labeled" and "label_updated") — Gitea sends "created" for new labels
- pr-rework: Guard against missing review object to prevent TypeError
  crash when Gitea sends review webhook without review data

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-12 16:12:04 +01:00

67 lines
1.9 KiB
TypeScript

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<string, string> = {
"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<IssueEvent>();
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 });
};
}