claude-task-worker 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +386 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +84 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/gh.d.ts +47 -0
- package/dist/gh.js +113 -0
- package/dist/gh.js.map +1 -0
- package/dist/git.d.ts +1 -0
- package/dist/git.js +14 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1890 -0
- package/dist/index.js.map +1 -0
- package/dist/process-manager.d.ts +8 -0
- package/dist/process-manager.js +218 -0
- package/dist/process-manager.js.map +1 -0
- package/dist/random-name.d.ts +1 -0
- package/dist/random-name.js +59 -0
- package/dist/random-name.js.map +1 -0
- package/dist/slack.d.ts +5 -0
- package/dist/slack.js +125 -0
- package/dist/slack.js.map +1 -0
- package/dist/usage.d.ts +2 -0
- package/dist/usage.js +52 -0
- package/dist/usage.js.map +1 -0
- package/dist/workers/create-issue.d.ts +1 -0
- package/dist/workers/create-issue.js +55 -0
- package/dist/workers/create-issue.js.map +1 -0
- package/dist/workers/exec-issue.d.ts +1 -0
- package/dist/workers/exec-issue.js +50 -0
- package/dist/workers/exec-issue.js.map +1 -0
- package/dist/workers/fix-review-point.d.ts +1 -0
- package/dist/workers/fix-review-point.js +62 -0
- package/dist/workers/fix-review-point.js.map +1 -0
- package/dist/workers/triage-issues.d.ts +3 -0
- package/dist/workers/triage-issues.js +54 -0
- package/dist/workers/triage-issues.js.map +1 -0
- package/dist/workers/triage-prs.d.ts +3 -0
- package/dist/workers/triage-prs.js +56 -0
- package/dist/workers/triage-prs.js.map +1 -0
- package/dist/workers/update-issue.d.ts +1 -0
- package/dist/workers/update-issue.js +61 -0
- package/dist/workers/update-issue.js.map +1 -0
- package/dist/worktree.d.ts +2 -0
- package/dist/worktree.js +34 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function setShuttingDown(): void;
|
|
2
|
+
export declare function isShuttingDown(): boolean;
|
|
3
|
+
export declare function isRunning(id: number): boolean;
|
|
4
|
+
export declare function isWorkerRunning(workerName: string): boolean;
|
|
5
|
+
export declare function isWorkerAtCapacity(workerName: string): boolean;
|
|
6
|
+
export declare function run(command: string, args: string[], id: number, title: string, workerName: string, path?: string, onComplete?: (status: "completed" | "failed", output: string) => void): void;
|
|
7
|
+
export declare function waitForAllProcesses(): Promise<void>;
|
|
8
|
+
export declare function shutdown(): void;
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { spawn, ChildProcess } from "node:child_process";
|
|
2
|
+
const childProcesses = new Map();
|
|
3
|
+
function getDisplayWidth(str) {
|
|
4
|
+
let width = 0;
|
|
5
|
+
for (const char of str) {
|
|
6
|
+
const code = char.codePointAt(0);
|
|
7
|
+
if ((code >= 0x1100 && code <= 0x115f) ||
|
|
8
|
+
(code >= 0x2e80 && code <= 0x303e) ||
|
|
9
|
+
(code >= 0x3040 && code <= 0x33bf) ||
|
|
10
|
+
(code >= 0x3400 && code <= 0x4dbf) ||
|
|
11
|
+
(code >= 0x4e00 && code <= 0xa4cf) ||
|
|
12
|
+
(code >= 0xac00 && code <= 0xd7af) ||
|
|
13
|
+
(code >= 0xf900 && code <= 0xfaff) ||
|
|
14
|
+
(code >= 0xfe30 && code <= 0xfe6f) ||
|
|
15
|
+
(code >= 0xff01 && code <= 0xff60) ||
|
|
16
|
+
(code >= 0xffe0 && code <= 0xffe6) ||
|
|
17
|
+
(code >= 0x20000 && code <= 0x2fffd) ||
|
|
18
|
+
(code >= 0x30000 && code <= 0x3fffd)) {
|
|
19
|
+
width += 2;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
width += 1;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return width;
|
|
26
|
+
}
|
|
27
|
+
function truncateToWidth(str, maxWidth) {
|
|
28
|
+
let width = 0;
|
|
29
|
+
let i = 0;
|
|
30
|
+
const chars = [...str];
|
|
31
|
+
while (i < chars.length) {
|
|
32
|
+
const charWidth = getDisplayWidth(chars[i]);
|
|
33
|
+
if (width + charWidth > maxWidth - 3) {
|
|
34
|
+
return chars.slice(0, i).join("") + "...";
|
|
35
|
+
}
|
|
36
|
+
width += charWidth;
|
|
37
|
+
i++;
|
|
38
|
+
}
|
|
39
|
+
return str;
|
|
40
|
+
}
|
|
41
|
+
function padToWidth(str, targetWidth) {
|
|
42
|
+
const currentWidth = getDisplayWidth(str);
|
|
43
|
+
const padding = targetWidth - currentWidth;
|
|
44
|
+
return padding > 0 ? str + " ".repeat(padding) : str;
|
|
45
|
+
}
|
|
46
|
+
const tasks = new Map();
|
|
47
|
+
let shuttingDown = false;
|
|
48
|
+
export function setShuttingDown() {
|
|
49
|
+
shuttingDown = true;
|
|
50
|
+
}
|
|
51
|
+
export function isShuttingDown() {
|
|
52
|
+
return shuttingDown;
|
|
53
|
+
}
|
|
54
|
+
export function isRunning(id) {
|
|
55
|
+
const task = tasks.get(id);
|
|
56
|
+
return task?.status === "running";
|
|
57
|
+
}
|
|
58
|
+
const MAX_CONCURRENT_TASKS_PER_WORKER = 4;
|
|
59
|
+
export function isWorkerRunning(workerName) {
|
|
60
|
+
for (const task of tasks.values()) {
|
|
61
|
+
if (task.workerName === workerName && task.status === "running") {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
export function isWorkerAtCapacity(workerName) {
|
|
68
|
+
let count = 0;
|
|
69
|
+
for (const task of tasks.values()) {
|
|
70
|
+
if (task.workerName === workerName && task.status === "running") {
|
|
71
|
+
count++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return count >= MAX_CONCURRENT_TASKS_PER_WORKER;
|
|
75
|
+
}
|
|
76
|
+
function formatDuration(start, end = new Date()) {
|
|
77
|
+
const diffMs = end.getTime() - start.getTime();
|
|
78
|
+
const totalSeconds = Math.floor(diffMs / 1000);
|
|
79
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
80
|
+
const seconds = totalSeconds % 60;
|
|
81
|
+
return `${minutes}m ${String(seconds).padStart(2, "0")}s`;
|
|
82
|
+
}
|
|
83
|
+
function formatTime(date) {
|
|
84
|
+
const h = String(date.getHours()).padStart(2, "0");
|
|
85
|
+
const m = String(date.getMinutes()).padStart(2, "0");
|
|
86
|
+
const s = String(date.getSeconds()).padStart(2, "0");
|
|
87
|
+
return `${h}:${m}:${s}`;
|
|
88
|
+
}
|
|
89
|
+
function renderTable() {
|
|
90
|
+
const entries = [...tasks.values()];
|
|
91
|
+
if (entries.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
const runningTasks = entries.filter((t) => t.status === "running");
|
|
94
|
+
const finishedTasks = entries.filter((t) => t.status !== "running");
|
|
95
|
+
const maxTitleWidth = 40;
|
|
96
|
+
const maxPathWidth = 40;
|
|
97
|
+
const allRows = [
|
|
98
|
+
...runningTasks.map((t) => ({
|
|
99
|
+
id: `#${t.id}`,
|
|
100
|
+
title: getDisplayWidth(t.title) > maxTitleWidth ? truncateToWidth(t.title, maxTitleWidth) : t.title,
|
|
101
|
+
worker: t.workerName,
|
|
102
|
+
path: t.path ? (t.path.length > maxPathWidth ? truncateToWidth(t.path, maxPathWidth) : t.path) : "",
|
|
103
|
+
status: t.status,
|
|
104
|
+
time: formatTime(t.startedAt),
|
|
105
|
+
duration: formatDuration(t.startedAt),
|
|
106
|
+
})),
|
|
107
|
+
...finishedTasks.map((t) => ({
|
|
108
|
+
id: `#${t.id}`,
|
|
109
|
+
title: getDisplayWidth(t.title) > maxTitleWidth ? truncateToWidth(t.title, maxTitleWidth) : t.title,
|
|
110
|
+
worker: t.workerName,
|
|
111
|
+
path: t.path ? (t.path.length > maxPathWidth ? truncateToWidth(t.path, maxPathWidth) : t.path) : "",
|
|
112
|
+
status: t.status,
|
|
113
|
+
time: formatTime(t.finishedAt ?? t.startedAt),
|
|
114
|
+
duration: formatDuration(t.startedAt, t.finishedAt),
|
|
115
|
+
})),
|
|
116
|
+
];
|
|
117
|
+
const hasPath = allRows.some((r) => r.path !== "");
|
|
118
|
+
const colWidths = {
|
|
119
|
+
id: Math.max(3, ...allRows.map((r) => r.id.length)),
|
|
120
|
+
title: Math.max(5, ...allRows.map((r) => getDisplayWidth(r.title))),
|
|
121
|
+
worker: Math.max(6, ...allRows.map((r) => r.worker.length)),
|
|
122
|
+
...(hasPath ? { path: Math.max(8, ...allRows.map((r) => r.path.length)) } : {}),
|
|
123
|
+
status: Math.max(6, ...allRows.map((r) => r.status.length)),
|
|
124
|
+
time: Math.max(4, ...allRows.map((r) => r.time.length)),
|
|
125
|
+
duration: Math.max(8, ...allRows.map((r) => r.duration.length)),
|
|
126
|
+
};
|
|
127
|
+
const pad = (s, w, useDisplayWidth = false) => useDisplayWidth ? padToWidth(s, w) : s + " ".repeat(w - s.length);
|
|
128
|
+
const cols = hasPath
|
|
129
|
+
? [colWidths.id, colWidths.title, colWidths.worker, colWidths.path, colWidths.status, colWidths.time, colWidths.duration]
|
|
130
|
+
: [colWidths.id, colWidths.title, colWidths.worker, colWidths.status, colWidths.time, colWidths.duration];
|
|
131
|
+
const line = (l, m, r, f) => `${l}${cols.map((w) => f.repeat(w + 2)).join(m)}${r}`;
|
|
132
|
+
const row = (id, title, worker, path, status, time, duration) => hasPath
|
|
133
|
+
? `│ ${pad(id, colWidths.id)} │ ${pad(title, colWidths.title, true)} │ ${pad(worker, colWidths.worker)} │ ${pad(path, colWidths.path)} │ ${pad(status, colWidths.status)} │ ${pad(time, colWidths.time)} │ ${pad(duration, colWidths.duration)} │`
|
|
134
|
+
: `│ ${pad(id, colWidths.id)} │ ${pad(title, colWidths.title, true)} │ ${pad(worker, colWidths.worker)} │ ${pad(status, colWidths.status)} │ ${pad(time, colWidths.time)} │ ${pad(duration, colWidths.duration)} │`;
|
|
135
|
+
const lines = [];
|
|
136
|
+
lines.push(line("┌", "┬", "┐", "─"));
|
|
137
|
+
lines.push(row("#", "Title", "Worker", "Worktree", "Status", "Time", "Duration"));
|
|
138
|
+
lines.push(line("├", "┼", "┤", "─"));
|
|
139
|
+
for (const r of allRows.filter((r) => r.status === "running")) {
|
|
140
|
+
lines.push(row(r.id, r.title, r.worker, r.path, r.status, r.time, r.duration));
|
|
141
|
+
}
|
|
142
|
+
if (runningTasks.length > 0 && finishedTasks.length > 0) {
|
|
143
|
+
lines.push(line("├", "┼", "┤", "─"));
|
|
144
|
+
}
|
|
145
|
+
for (const r of allRows.filter((r) => r.status !== "running")) {
|
|
146
|
+
lines.push(row(r.id, r.title, r.worker, r.path, r.status, r.time, r.duration));
|
|
147
|
+
}
|
|
148
|
+
lines.push(line("└", "┴", "┘", "─"));
|
|
149
|
+
console.clear();
|
|
150
|
+
console.log(lines.join("\n"));
|
|
151
|
+
}
|
|
152
|
+
let renderInterval;
|
|
153
|
+
function ensureRenderInterval() {
|
|
154
|
+
if (renderInterval)
|
|
155
|
+
return;
|
|
156
|
+
renderInterval = setInterval(renderTable, 1000);
|
|
157
|
+
renderInterval.unref();
|
|
158
|
+
}
|
|
159
|
+
export function run(command, args, id, title, workerName, path, onComplete) {
|
|
160
|
+
tasks.set(id, {
|
|
161
|
+
id,
|
|
162
|
+
title,
|
|
163
|
+
status: "running",
|
|
164
|
+
workerName,
|
|
165
|
+
path,
|
|
166
|
+
startedAt: new Date(),
|
|
167
|
+
});
|
|
168
|
+
ensureRenderInterval();
|
|
169
|
+
renderTable();
|
|
170
|
+
const child = spawn(command, args, { stdio: ["ignore", "pipe", "inherit"], detached: true });
|
|
171
|
+
childProcesses.set(id, child);
|
|
172
|
+
const outputChunks = [];
|
|
173
|
+
child.stdout?.on("data", (chunk) => {
|
|
174
|
+
outputChunks.push(chunk);
|
|
175
|
+
});
|
|
176
|
+
child.on("close", (code) => {
|
|
177
|
+
childProcesses.delete(id);
|
|
178
|
+
const task = tasks.get(id);
|
|
179
|
+
if (task) {
|
|
180
|
+
task.status = code === 0 ? "completed" : "failed";
|
|
181
|
+
task.finishedAt = new Date();
|
|
182
|
+
}
|
|
183
|
+
renderTable();
|
|
184
|
+
const output = Buffer.concat(outputChunks).toString("utf-8");
|
|
185
|
+
onComplete?.(code === 0 ? "completed" : "failed", output);
|
|
186
|
+
});
|
|
187
|
+
child.on("error", (err) => {
|
|
188
|
+
childProcesses.delete(id);
|
|
189
|
+
const task = tasks.get(id);
|
|
190
|
+
if (task) {
|
|
191
|
+
task.status = "failed";
|
|
192
|
+
task.finishedAt = new Date();
|
|
193
|
+
}
|
|
194
|
+
console.error(`[worker] failed to spawn process for #${id}: ${err.message}`);
|
|
195
|
+
renderTable();
|
|
196
|
+
onComplete?.("failed", err.message);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
export function waitForAllProcesses() {
|
|
200
|
+
return new Promise((resolve) => {
|
|
201
|
+
const check = () => {
|
|
202
|
+
if (childProcesses.size === 0) {
|
|
203
|
+
resolve();
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
setTimeout(check, 500);
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
check();
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
export function shutdown() {
|
|
213
|
+
for (const [id, child] of childProcesses) {
|
|
214
|
+
child.kill("SIGTERM");
|
|
215
|
+
childProcesses.delete(id);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../src/process-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function generateWorktreeName(): string;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { randomInt } from "node:crypto";
|
|
2
|
+
const ADJECTIVES = [
|
|
3
|
+
"brave", "calm", "dark", "eager", "fair",
|
|
4
|
+
"gentle", "happy", "keen", "lively", "noble",
|
|
5
|
+
"proud", "quiet", "rapid", "sharp", "swift",
|
|
6
|
+
"tender", "vivid", "warm", "bold", "bright",
|
|
7
|
+
"clever", "daring", "fierce", "grand", "humble",
|
|
8
|
+
"jovial", "kind", "lucky", "mighty", "neat",
|
|
9
|
+
"agile", "amber", "breezy", "crisp", "deep",
|
|
10
|
+
"dusty", "elfin", "frosty", "golden", "hardy",
|
|
11
|
+
"icy", "joyful", "lean", "misty", "nimble",
|
|
12
|
+
"open", "peppy", "radiant", "serene", "tidy",
|
|
13
|
+
"upbeat", "valiant", "wiry", "zesty", "ancient",
|
|
14
|
+
"brisk", "crispy", "deft", "earnest", "fleet",
|
|
15
|
+
"airy", "ardent", "astute", "azure", "balmy",
|
|
16
|
+
"blithe", "buoyant", "candid", "cheery", "coastal",
|
|
17
|
+
"dashing", "dazzling", "devoted", "dynamic", "edgy",
|
|
18
|
+
"elegant", "enduring", "exotic", "fabled", "faithful",
|
|
19
|
+
"famous", "fearless", "flawless", "fluent", "focused",
|
|
20
|
+
"forceful", "forged", "frank", "fresh", "frugal",
|
|
21
|
+
"gallant", "gifted", "glowing", "graceful", "grounded",
|
|
22
|
+
"honest", "hopeful", "ideal", "immense", "intact",
|
|
23
|
+
"intrepid", "ironclad", "ivory", "keen", "knowing",
|
|
24
|
+
"lavish", "level", "lithe", "lofty", "loyal",
|
|
25
|
+
"luminous", "majestic", "mellow", "mindful", "modern",
|
|
26
|
+
];
|
|
27
|
+
const NOUNS = [
|
|
28
|
+
"falcon", "river", "cedar", "flame", "stone",
|
|
29
|
+
"breeze", "coral", "delta", "frost", "grove",
|
|
30
|
+
"harbor", "iris", "jade", "lark", "maple",
|
|
31
|
+
"orbit", "pearl", "ridge", "spark", "tide",
|
|
32
|
+
"vale", "wolf", "apex", "bloom", "crest",
|
|
33
|
+
"dawn", "ember", "flint", "hawk", "sage",
|
|
34
|
+
"arrow", "basin", "cliff", "dune", "echo",
|
|
35
|
+
"fern", "gale", "helm", "isle", "jungle",
|
|
36
|
+
"kite", "lance", "marsh", "nova", "oak",
|
|
37
|
+
"pine", "quill", "reef", "shore", "thorn",
|
|
38
|
+
"umber", "veil", "wave", "xenon", "yew",
|
|
39
|
+
"zenith", "acorn", "birch", "comet", "dew",
|
|
40
|
+
"abyss", "anchor", "anvil", "arc", "ash",
|
|
41
|
+
"atlas", "aurora", "axe", "bay", "beacon",
|
|
42
|
+
"blade", "bolt", "brook", "bud", "burl",
|
|
43
|
+
"cairn", "canopy", "cape", "cavern", "chain",
|
|
44
|
+
"chalk", "chasm", "chord", "chrome", "citrus",
|
|
45
|
+
"claw", "cloud", "cobalt", "creek", "crown",
|
|
46
|
+
"crystal", "current", "cypress", "depot", "depth",
|
|
47
|
+
"drift", "dusk", "dust", "eddy", "elm",
|
|
48
|
+
"epoch", "ether", "field", "fin", "fjord",
|
|
49
|
+
"foam", "forge", "fossil", "geyser", "glacier",
|
|
50
|
+
"glow", "granite", "heath", "heron", "hollow",
|
|
51
|
+
];
|
|
52
|
+
function pick(list) {
|
|
53
|
+
return list[randomInt(list.length)];
|
|
54
|
+
}
|
|
55
|
+
export function generateWorktreeName() {
|
|
56
|
+
const suffix = String(randomInt(10000)).padStart(4, "0");
|
|
57
|
+
return `${pick(ADJECTIVES)}-${pick(NOUNS)}-${suffix}`;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=random-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random-name.js","sourceRoot":"","sources":["../src/random-name.ts"],"names":[],"mappings":"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"}
|
package/dist/slack.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function send(payload: Record<string, unknown>): Promise<void>;
|
|
2
|
+
export declare function buildTokenLimitText(): Promise<string>;
|
|
3
|
+
export declare function notifyTaskCompleted(workerName: string, repoName: string, id: number, title: string, url: string): Promise<void>;
|
|
4
|
+
export declare function notifyTaskFailed(workerName: string, repoName: string, id: number, title: string, url: string, output?: string): Promise<void>;
|
|
5
|
+
export declare function notifyError(workerName: string, repoName: string, error: unknown): Promise<void>;
|
package/dist/slack.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
const WEBHOOK_URL = process.env.CLAUDE_TASK_WORKER_SLACK_WEBHOOK_URL;
|
|
6
|
+
const USAGE_CACHE_PATH = "/tmp/claude-usage-cache.json";
|
|
7
|
+
const USAGE_CACHE_TTL_SECONDS = 360;
|
|
8
|
+
export async function send(payload) {
|
|
9
|
+
if (!WEBHOOK_URL)
|
|
10
|
+
return;
|
|
11
|
+
try {
|
|
12
|
+
await fetch(WEBHOOK_URL, {
|
|
13
|
+
method: "POST",
|
|
14
|
+
headers: { "Content-Type": "application/json" },
|
|
15
|
+
body: JSON.stringify(payload),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
console.error(`[slack] Failed to send notification: ${err}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function getOAuthToken() {
|
|
23
|
+
const { stdout } = await execAsync('security find-generic-password -s "Claude Code-credentials" -w');
|
|
24
|
+
const credentials = JSON.parse(stdout.trim());
|
|
25
|
+
return credentials.claudeAiOauth?.accessToken ?? credentials.oauth_token ?? credentials.access_token ?? credentials;
|
|
26
|
+
}
|
|
27
|
+
function readUsageCache() {
|
|
28
|
+
try {
|
|
29
|
+
const raw = readFileSync(USAGE_CACHE_PATH, "utf-8");
|
|
30
|
+
const cached = JSON.parse(raw);
|
|
31
|
+
if (Date.now() - cached.timestamp < USAGE_CACHE_TTL_SECONDS * 1000) {
|
|
32
|
+
return cached.data;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
function writeUsageCache(data) {
|
|
40
|
+
try {
|
|
41
|
+
writeFileSync(USAGE_CACHE_PATH, JSON.stringify({ timestamp: Date.now(), data }));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function fetchUsageInfo() {
|
|
47
|
+
const cached = readUsageCache();
|
|
48
|
+
if (cached)
|
|
49
|
+
return cached;
|
|
50
|
+
try {
|
|
51
|
+
const token = await getOAuthToken();
|
|
52
|
+
const res = await fetch("https://api.anthropic.com/api/oauth/usage", {
|
|
53
|
+
headers: {
|
|
54
|
+
Authorization: `Bearer ${token}`,
|
|
55
|
+
"anthropic-beta": "oauth-2025-04-20",
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
console.error(`[slack] Usage API returned ${res.status}`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const body = await res.json();
|
|
63
|
+
const data = {
|
|
64
|
+
fiveHourUtilization: body.five_hour.utilization,
|
|
65
|
+
fiveHourResetsAt: body.five_hour.resets_at,
|
|
66
|
+
sevenDayUtilization: body.seven_day.utilization,
|
|
67
|
+
sevenDayResetsAt: body.seven_day.resets_at,
|
|
68
|
+
};
|
|
69
|
+
writeUsageCache(data);
|
|
70
|
+
return data;
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
console.error(`[slack] Failed to fetch usage info: ${err}`);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function utilizationEmoji(value) {
|
|
78
|
+
if (value < 50)
|
|
79
|
+
return "🟢";
|
|
80
|
+
if (value < 80)
|
|
81
|
+
return "🟡";
|
|
82
|
+
return "🔴";
|
|
83
|
+
}
|
|
84
|
+
function formatResetTimeJST(isoString) {
|
|
85
|
+
const date = new Date(isoString);
|
|
86
|
+
return date.toLocaleString("ja-JP", {
|
|
87
|
+
timeZone: "Asia/Tokyo",
|
|
88
|
+
month: "numeric",
|
|
89
|
+
day: "numeric",
|
|
90
|
+
hour: "numeric",
|
|
91
|
+
minute: "2-digit",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export async function buildTokenLimitText() {
|
|
95
|
+
const usage = await fetchUsageInfo();
|
|
96
|
+
if (!usage)
|
|
97
|
+
return "";
|
|
98
|
+
const fiveH = usage.fiveHourUtilization.toFixed(1);
|
|
99
|
+
const sevenD = usage.sevenDayUtilization.toFixed(1);
|
|
100
|
+
const emoji = utilizationEmoji(Math.max(usage.fiveHourUtilization, usage.sevenDayUtilization));
|
|
101
|
+
const fiveHReset = formatResetTimeJST(usage.fiveHourResetsAt);
|
|
102
|
+
const sevenDReset = formatResetTimeJST(usage.sevenDayResetsAt);
|
|
103
|
+
return ` | ${emoji} 5h: ${fiveH}% (reset: ${fiveHReset}) / 7d: ${sevenD}% (reset: ${sevenDReset})`;
|
|
104
|
+
}
|
|
105
|
+
export async function notifyTaskCompleted(workerName, repoName, id, title, url) {
|
|
106
|
+
const tokenText = await buildTokenLimitText();
|
|
107
|
+
await send({
|
|
108
|
+
text: `✅ [${workerName}] ${repoName} | Task completed: <${url}|#${id} ${title}>${tokenText}`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
export async function notifyTaskFailed(workerName, repoName, id, title, url, output) {
|
|
112
|
+
const tokenText = await buildTokenLimitText();
|
|
113
|
+
const truncatedOutput = output && output.length > 1000 ? `…${output.slice(-1000)}` : output;
|
|
114
|
+
const outputBlock = truncatedOutput ? `\n\`\`\`${truncatedOutput}\`\`\`` : "";
|
|
115
|
+
await send({
|
|
116
|
+
text: `❌ [${workerName}] ${repoName} | Task failed: <${url}|#${id} ${title}>${tokenText}${outputBlock}`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
export async function notifyError(workerName, repoName, error) {
|
|
120
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
121
|
+
await send({
|
|
122
|
+
text: `🚨 [${workerName}] ${repoName} | Error: ${message}`,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"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"}
|
package/dist/usage.d.ts
ADDED
package/dist/usage.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const USAGE_API_URL = process.env.CLAUDE_TASK_WORKER_USASE_API_URL;
|
|
2
|
+
const PERIOD_LABELS = {
|
|
3
|
+
five_hour: "5h",
|
|
4
|
+
seven_day: "7d",
|
|
5
|
+
seven_day_oauth_apps: "7d (OAuth Apps)",
|
|
6
|
+
seven_day_opus: "7d (Opus)",
|
|
7
|
+
seven_day_sonnet: "7d (Sonnet)",
|
|
8
|
+
seven_day_cowork: "7d (Cowork)",
|
|
9
|
+
extra_usage: "Extra",
|
|
10
|
+
};
|
|
11
|
+
function utilizationBar(utilization) {
|
|
12
|
+
const filled = Math.round(utilization / 10);
|
|
13
|
+
return "█".repeat(filled) + "░".repeat(10 - filled);
|
|
14
|
+
}
|
|
15
|
+
function formatResetAt(isoString) {
|
|
16
|
+
const date = new Date(isoString);
|
|
17
|
+
const jst = new Date(date.getTime() + 9 * 60 * 60 * 1000);
|
|
18
|
+
const m = String(jst.getUTCMonth() + 1).padStart(2, "0");
|
|
19
|
+
const d = String(jst.getUTCDate()).padStart(2, "0");
|
|
20
|
+
const h = String(jst.getUTCHours()).padStart(2, "0");
|
|
21
|
+
const min = String(jst.getUTCMinutes()).padStart(2, "0");
|
|
22
|
+
return `${m}/${d} ${h}:${min} JST`;
|
|
23
|
+
}
|
|
24
|
+
export function formatUsageMetrics(usage) {
|
|
25
|
+
const lines = [];
|
|
26
|
+
for (const [key, value] of Object.entries(usage)) {
|
|
27
|
+
if (!value || typeof value !== "object")
|
|
28
|
+
continue;
|
|
29
|
+
const period = value;
|
|
30
|
+
if (typeof period.utilization !== "number")
|
|
31
|
+
continue;
|
|
32
|
+
const label = PERIOD_LABELS[key] ?? key;
|
|
33
|
+
const bar = utilizationBar(period.utilization);
|
|
34
|
+
const reset = formatResetAt(period.resets_at);
|
|
35
|
+
lines.push(`• *${label}:* ${period.utilization}% \`${bar}\` (resets: ${reset})`);
|
|
36
|
+
}
|
|
37
|
+
return lines.length > 0 ? lines.join("\n") : "No active usage periods";
|
|
38
|
+
}
|
|
39
|
+
export async function fetchUsageMetrics() {
|
|
40
|
+
if (!USAGE_API_URL)
|
|
41
|
+
return null;
|
|
42
|
+
try {
|
|
43
|
+
const response = await fetch(USAGE_API_URL);
|
|
44
|
+
if (!response.ok)
|
|
45
|
+
return null;
|
|
46
|
+
return (await response.json());
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createIssueWorker(): Promise<void>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { getCurrentUser, getRepoInfo, listIssues, removeLabel, addLabel } from "../gh.js";
|
|
2
|
+
import { syncDefaultBranch } from "../git.js";
|
|
3
|
+
import { isRunning, isWorkerAtCapacity, isShuttingDown, run } from "../process-manager.js";
|
|
4
|
+
import { generateWorktreeName } from "../random-name.js";
|
|
5
|
+
import { notifyTaskCompleted, notifyTaskFailed, notifyError } from "../slack.js";
|
|
6
|
+
import { removeWorktree } from "../worktree.js";
|
|
7
|
+
const POLLING_INTERVAL_MS = 30 * 1000;
|
|
8
|
+
export async function createIssueWorker() {
|
|
9
|
+
const { owner, name, defaultBranch } = await getRepoInfo();
|
|
10
|
+
const user = await getCurrentUser();
|
|
11
|
+
console.log(`[create-issue] Polling issues every 30 seconds for ${owner}/${name} (assignee: ${user})`);
|
|
12
|
+
const tick = async () => {
|
|
13
|
+
if (isShuttingDown())
|
|
14
|
+
return;
|
|
15
|
+
try {
|
|
16
|
+
const issues = await listIssues(user, "cc-create-issue");
|
|
17
|
+
for (const issue of issues) {
|
|
18
|
+
if (issue.labels.some(l => l.name === "cc-in-progress"))
|
|
19
|
+
continue;
|
|
20
|
+
if (isRunning(issue.number))
|
|
21
|
+
continue;
|
|
22
|
+
if (isWorkerAtCapacity("create-issue"))
|
|
23
|
+
break;
|
|
24
|
+
await addLabel("issue", issue.number, "cc-in-progress");
|
|
25
|
+
const issueUrl = `https://github.com/${owner}/${name}/issues/${issue.number}`;
|
|
26
|
+
const worktreeId = generateWorktreeName();
|
|
27
|
+
syncDefaultBranch(defaultBranch);
|
|
28
|
+
run("claude", ["--dangerously-skip-permissions", "-p", `/base-tools:create-issue #${issue.number}`, "--worktree", worktreeId], issue.number, issue.title, "create-issue", worktreeId, async (status, output) => {
|
|
29
|
+
await removeWorktree(worktreeId);
|
|
30
|
+
try {
|
|
31
|
+
await removeLabel("issue", issue.number, "cc-create-issue");
|
|
32
|
+
await removeLabel("issue", issue.number, "cc-in-progress");
|
|
33
|
+
await addLabel("issue", issue.number, "cc-issue-created");
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.error(`[create-issue] Failed to cleanup labels for issue #${issue.number}: ${err}`);
|
|
37
|
+
}
|
|
38
|
+
if (status === "completed") {
|
|
39
|
+
await notifyTaskCompleted("create-issue", name, issue.number, issue.title, issueUrl);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
await notifyTaskFailed("create-issue", name, issue.number, issue.title, issueUrl, output);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
console.error(`[create-issue] tick error: ${err}`);
|
|
49
|
+
await notifyError("create-issue", name, err);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
await tick();
|
|
53
|
+
setInterval(tick, POLLING_INTERVAL_MS);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=create-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue.js","sourceRoot":"","sources":["../../src/workers/create-issue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function execIssueWorker(): Promise<void>;
|