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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +386 -0
  3. package/dist/commands/init.d.ts +1 -0
  4. package/dist/commands/init.js +84 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/gh.d.ts +47 -0
  7. package/dist/gh.js +113 -0
  8. package/dist/gh.js.map +1 -0
  9. package/dist/git.d.ts +1 -0
  10. package/dist/git.js +14 -0
  11. package/dist/git.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +1890 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/process-manager.d.ts +8 -0
  16. package/dist/process-manager.js +218 -0
  17. package/dist/process-manager.js.map +1 -0
  18. package/dist/random-name.d.ts +1 -0
  19. package/dist/random-name.js +59 -0
  20. package/dist/random-name.js.map +1 -0
  21. package/dist/slack.d.ts +5 -0
  22. package/dist/slack.js +125 -0
  23. package/dist/slack.js.map +1 -0
  24. package/dist/usage.d.ts +2 -0
  25. package/dist/usage.js +52 -0
  26. package/dist/usage.js.map +1 -0
  27. package/dist/workers/create-issue.d.ts +1 -0
  28. package/dist/workers/create-issue.js +55 -0
  29. package/dist/workers/create-issue.js.map +1 -0
  30. package/dist/workers/exec-issue.d.ts +1 -0
  31. package/dist/workers/exec-issue.js +50 -0
  32. package/dist/workers/exec-issue.js.map +1 -0
  33. package/dist/workers/fix-review-point.d.ts +1 -0
  34. package/dist/workers/fix-review-point.js +62 -0
  35. package/dist/workers/fix-review-point.js.map +1 -0
  36. package/dist/workers/triage-issues.d.ts +3 -0
  37. package/dist/workers/triage-issues.js +54 -0
  38. package/dist/workers/triage-issues.js.map +1 -0
  39. package/dist/workers/triage-prs.d.ts +3 -0
  40. package/dist/workers/triage-prs.js +56 -0
  41. package/dist/workers/triage-prs.js.map +1 -0
  42. package/dist/workers/update-issue.d.ts +1 -0
  43. package/dist/workers/update-issue.js +61 -0
  44. package/dist/workers/update-issue.js.map +1 -0
  45. package/dist/worktree.d.ts +2 -0
  46. package/dist/worktree.js +34 -0
  47. package/dist/worktree.js.map +1 -0
  48. 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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"}
@@ -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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC;AACrE,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AACxD,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAgC;IACzD,IAAI,CAAC,WAAW;QAAE,OAAO;IAEzB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,WAAW,EAAE;YACvB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AASD,KAAK,UAAU,aAAa;IAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,gEAAgE,CACjE,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,WAAW,CAAC,aAAa,EAAE,WAAW,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC;AACtH,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,uBAAuB,GAAG,IAAI,EAAE,CAAC;YACnE,OAAO,MAAM,CAAC,IAAiB,CAAC;QAClC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;IACT,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,IAAe;IACtC,IAAI,CAAC;QACH,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;IACT,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,2CAA2C,EAAE;YACnE,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,gBAAgB,EAAE,kBAAkB;aACrC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAc;YACtB,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW;YAC/C,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;YAC1C,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW;YAC/C,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;SAC3C,CAAC;QACF,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAClC,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC/F,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/D,OAAO,MAAM,KAAK,QAAQ,KAAK,aAAa,UAAU,WAAW,MAAM,aAAa,WAAW,GAAG,CAAC;AACrG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB,EAAE,QAAgB,EAAE,EAAU,EAAE,KAAa,EAAE,GAAW;IACpH,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC9C,MAAM,IAAI,CAAC;QACT,IAAI,EAAE,MAAM,UAAU,KAAK,QAAQ,uBAAuB,GAAG,KAAK,EAAE,IAAI,KAAK,IAAI,SAAS,EAAE;KAC7F,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB,EAAE,QAAgB,EAAE,EAAU,EAAE,KAAa,EAAE,GAAW,EAAE,MAAe;IAClI,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC9C,MAAM,eAAe,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5F,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,WAAW,eAAe,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,MAAM,IAAI,CAAC;QACT,IAAI,EAAE,MAAM,UAAU,KAAK,QAAQ,oBAAoB,GAAG,KAAK,EAAE,IAAI,KAAK,IAAI,SAAS,GAAG,WAAW,EAAE;KACxG,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB,EAAE,QAAgB,EAAE,KAAc;IACpF,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,CAAC;QACT,IAAI,EAAE,OAAO,UAAU,KAAK,QAAQ,aAAa,OAAO,EAAE;KAC3D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function formatUsageMetrics(usage: Record<string, unknown>): string;
2
+ export declare function fetchUsageMetrics(): Promise<Record<string, unknown> | null>;
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>;