Initial commit: SDLC Orchestrator replacing n8n
Lightweight Hono webhook router that receives Gitea events and creates Coder workspaces for each SDLC stage (analyse, architect, develop, review, test, rework, release, maintenance). Includes k8s manifests for deployment and the Coder workspace template moved from babble. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
import type { Context } from "hono";
|
||||
import type { IssueEvent, TaskRequest } from "../types.js";
|
||||
import type { CoderClient } from "../services/coder.js";
|
||||
import type { GiteaClient } from "../services/gitea.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, coder: CoderClient, gitea: GiteaClient) {
|
||||
return async (c: Context) => {
|
||||
const event = await c.req.json<IssueEvent>();
|
||||
|
||||
if (event.action !== "label_updated" && event.action !== "labeled") {
|
||||
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,
|
||||
};
|
||||
|
||||
console.log(`[issue-label] #${task.issueNumber} → ${taskType}`);
|
||||
|
||||
const workspace = await coder.createWorkspace(task);
|
||||
console.log(`[issue-label] workspace created: ${workspace.name}`);
|
||||
|
||||
await gitea.commentOnIssue(
|
||||
org,
|
||||
repo,
|
||||
event.issue.number,
|
||||
`🤖 SDLC stage transition: **${taskType}** — workspace created.`,
|
||||
);
|
||||
|
||||
return c.json({ ok: true, workspace: workspace.name });
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user