kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import type { Octokit } from "octokit";
2
3const labelColors: Record<string, string> = {
4 "priority:low": "0EA5E9",
5 "priority:medium": "EAB308",
6 "priority:high": "F97316",
7 "priority:urgent": "EF4444",
8 "status:to-do": "6B7280",
9 "status:in-progress": "3B82F6",
10 "status:in-review": "8B5CF6",
11 "status:done": "10B981",
12 "status:planned": "8B5CF6",
13 "status:archived": "6B7280",
14};
15
16export function getLabelColor(labelName: string): string {
17 return labelColors[labelName] || "6B7280";
18}
19
20export async function ensureLabelsExist(
21 octokit: Octokit,
22 owner: string,
23 repo: string,
24 labels: string[],
25) {
26 for (const labelName of labels) {
27 try {
28 await octokit.rest.issues.getLabel({
29 owner,
30 repo,
31 name: labelName,
32 });
33 } catch {
34 try {
35 const color = getLabelColor(labelName);
36 await octokit.rest.issues.createLabel({
37 owner,
38 repo,
39 name: labelName,
40 color,
41 });
42 } catch (createError) {
43 console.error(`Failed to create label "${labelName}":`, createError);
44 }
45 }
46 }
47}
48
49export async function addLabelsToIssue(
50 octokit: Octokit,
51 owner: string,
52 repo: string,
53 issueNumber: number,
54 labels: string[],
55) {
56 try {
57 await ensureLabelsExist(octokit, owner, repo, labels);
58
59 await octokit.rest.issues.addLabels({
60 owner,
61 repo,
62 issue_number: issueNumber,
63 labels,
64 });
65 } catch (error) {
66 console.error("Failed to add labels to issue:", error);
67 }
68}
69
70export async function removeLabel(
71 octokit: Octokit,
72 owner: string,
73 repo: string,
74 issueNumber: number,
75 labelName: string,
76) {
77 try {
78 await octokit.rest.issues.removeLabel({
79 owner,
80 repo,
81 issue_number: issueNumber,
82 name: labelName,
83 });
84 } catch {}
85}