Publish Image / publish (push) Successful in 22s
- 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>
67 lines
1.9 KiB
TypeScript
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 });
|
|
};
|
|
}
|