claude-task-worker 0.1.0 → 0.2.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/README.md +6 -2
- package/dist/index.js +26 -2
- package/package.json +1 -1
- package/dist/commands/init.d.ts +0 -1
- package/dist/commands/init.js +0 -84
- package/dist/commands/init.js.map +0 -1
- package/dist/gh.d.ts +0 -47
- package/dist/gh.js +0 -113
- package/dist/gh.js.map +0 -1
- package/dist/git.d.ts +0 -1
- package/dist/git.js +0 -14
- package/dist/git.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js.map +0 -1
- package/dist/process-manager.d.ts +0 -8
- package/dist/process-manager.js +0 -218
- package/dist/process-manager.js.map +0 -1
- package/dist/random-name.d.ts +0 -1
- package/dist/random-name.js +0 -59
- package/dist/random-name.js.map +0 -1
- package/dist/slack.d.ts +0 -5
- package/dist/slack.js +0 -125
- package/dist/slack.js.map +0 -1
- package/dist/usage.d.ts +0 -2
- package/dist/usage.js +0 -52
- package/dist/usage.js.map +0 -1
- package/dist/workers/create-issue.d.ts +0 -1
- package/dist/workers/create-issue.js +0 -55
- package/dist/workers/create-issue.js.map +0 -1
- package/dist/workers/exec-issue.d.ts +0 -1
- package/dist/workers/exec-issue.js +0 -50
- package/dist/workers/exec-issue.js.map +0 -1
- package/dist/workers/fix-review-point.d.ts +0 -1
- package/dist/workers/fix-review-point.js +0 -62
- package/dist/workers/fix-review-point.js.map +0 -1
- package/dist/workers/triage-issues.d.ts +0 -3
- package/dist/workers/triage-issues.js +0 -54
- package/dist/workers/triage-issues.js.map +0 -1
- package/dist/workers/triage-prs.d.ts +0 -3
- package/dist/workers/triage-prs.js +0 -56
- package/dist/workers/triage-prs.js.map +0 -1
- package/dist/workers/update-issue.d.ts +0 -1
- package/dist/workers/update-issue.js +0 -61
- package/dist/workers/update-issue.js.map +0 -1
- package/dist/worktree.d.ts +0 -2
- package/dist/worktree.js +0 -34
- package/dist/worktree.js.map +0 -1
package/dist/random-name.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
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
|
package/dist/random-name.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"random-name.js","sourceRoot":"","sources":["../src/random-name.ts"],"names":[],"mappings":"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"}
|
package/dist/slack.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
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
|
package/dist/slack.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"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"}
|
package/dist/usage.d.ts
DELETED
package/dist/usage.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
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
|
package/dist/usage.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;AAOnE,MAAM,aAAa,GAA2B;IAC5C,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,oBAAoB,EAAE,iBAAiB;IACvC,cAAc,EAAE,WAAW;IAC3B,gBAAgB,EAAE,aAAa;IAC/B,gBAAgB,EAAE,aAAa;IAC/B,WAAW,EAAE,OAAO;CACrB,CAAC;AAEF,SAAS,cAAc,CAAC,WAAmB;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,MAAM,GAAG,KAAoB,CAAC;QACpC,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;YAAE,SAAS;QAErD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;QACxC,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,MAAM,CAAC,WAAW,OAAO,GAAG,eAAe,KAAK,GAAG,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function createIssueWorker(): Promise<void>;
|
|
@@ -1,55 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-issue.js","sourceRoot":"","sources":["../../src/workers/create-issue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function execIssueWorker(): Promise<void>;
|
|
@@ -1,50 +0,0 @@
|
|
|
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 execIssueWorker() {
|
|
9
|
-
const { owner, name, defaultBranch } = await getRepoInfo();
|
|
10
|
-
const user = await getCurrentUser();
|
|
11
|
-
console.log(`[exec-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-exec-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("exec-issue"))
|
|
23
|
-
break;
|
|
24
|
-
const issueUrl = `https://github.com/${owner}/${name}/issues/${issue.number}`;
|
|
25
|
-
const worktreeId = generateWorktreeName();
|
|
26
|
-
await addLabel("issue", issue.number, "cc-in-progress");
|
|
27
|
-
syncDefaultBranch(defaultBranch);
|
|
28
|
-
run("claude", ["--dangerously-skip-permissions", "-p", `/base-tools:exec-issue ${issue.number} --triage-scope`, "--worktree", worktreeId], issue.number, issue.title, "exec-issue", worktreeId, async (status, output) => {
|
|
29
|
-
if (status === "completed") {
|
|
30
|
-
await addLabel("issue", issue.number, "cc-pr-created");
|
|
31
|
-
await notifyTaskCompleted("exec-issue", name, issue.number, issue.title, issueUrl);
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
await notifyTaskFailed("exec-issue", name, issue.number, issue.title, issueUrl, output);
|
|
35
|
-
}
|
|
36
|
-
await removeLabel("issue", issue.number, "cc-exec-issue");
|
|
37
|
-
await removeLabel("issue", issue.number, "cc-in-progress");
|
|
38
|
-
await removeWorktree(worktreeId);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
console.error(`[exec-issue] tick error: ${err}`);
|
|
44
|
-
await notifyError("exec-issue", name, err);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
await tick();
|
|
48
|
-
setInterval(tick, POLLING_INTERVAL_MS);
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=exec-issue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exec-issue.js","sourceRoot":"","sources":["../../src/workers/exec-issue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function fixReviewPointWorker(): Promise<void>;
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { getCurrentUser, getRepoInfo, listPullRequestsWithChecks, isCICompleted, addLabel, removeLabel } from "../gh.js";
|
|
2
|
-
import { syncDefaultBranch } from "../git.js";
|
|
3
|
-
import { isRunning, isWorkerAtCapacity, isWorkerRunning, 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
|
-
const LABEL_FIX_ONETIME = "cc-fix-onetime";
|
|
9
|
-
const LABEL_FIX_REPEAT = "cc-fix-repeat";
|
|
10
|
-
const LABEL_IN_PROGRESS = "cc-in-progress";
|
|
11
|
-
export async function fixReviewPointWorker() {
|
|
12
|
-
const { owner, name, defaultBranch } = await getRepoInfo();
|
|
13
|
-
const user = await getCurrentUser();
|
|
14
|
-
console.log(`[fix-review-point] Polling PRs every 30 seconds for ${owner}/${name} (assignee: ${user})`);
|
|
15
|
-
const tick = async () => {
|
|
16
|
-
if (isShuttingDown())
|
|
17
|
-
return;
|
|
18
|
-
try {
|
|
19
|
-
if (isWorkerRunning("triage-prs"))
|
|
20
|
-
return;
|
|
21
|
-
const prs = await listPullRequestsWithChecks(user);
|
|
22
|
-
const candidates = prs.filter((pr) => {
|
|
23
|
-
const labels = pr.labels.map((l) => l.name);
|
|
24
|
-
if (labels.includes(LABEL_IN_PROGRESS))
|
|
25
|
-
return false;
|
|
26
|
-
if (!isCICompleted(pr.statusCheckRollup))
|
|
27
|
-
return false;
|
|
28
|
-
return labels.includes(LABEL_FIX_ONETIME) || labels.includes(LABEL_FIX_REPEAT);
|
|
29
|
-
});
|
|
30
|
-
for (const pr of candidates) {
|
|
31
|
-
if (isRunning(pr.number))
|
|
32
|
-
continue;
|
|
33
|
-
if (isWorkerAtCapacity("fix-review-point"))
|
|
34
|
-
break;
|
|
35
|
-
const isOnetime = pr.labels.some((l) => l.name === LABEL_FIX_ONETIME);
|
|
36
|
-
const prUrl = `https://github.com/${owner}/${name}/pull/${pr.number}`;
|
|
37
|
-
const worktreeId = generateWorktreeName();
|
|
38
|
-
await addLabel("pr", pr.number, LABEL_IN_PROGRESS);
|
|
39
|
-
syncDefaultBranch(defaultBranch);
|
|
40
|
-
run("claude", ["--dangerously-skip-permissions", "-p", `/base-tools:fix-review-point ${pr.headRefName}`, "--worktree", worktreeId], pr.number, `PR #${pr.number} (${pr.headRefName})`, "fix-review-point", worktreeId, async (status, output) => {
|
|
41
|
-
await removeWorktree(worktreeId);
|
|
42
|
-
if (isOnetime)
|
|
43
|
-
await removeLabel("pr", pr.number, LABEL_FIX_ONETIME);
|
|
44
|
-
await removeLabel("pr", pr.number, LABEL_IN_PROGRESS);
|
|
45
|
-
if (status === "completed") {
|
|
46
|
-
await notifyTaskCompleted("fix-review-point", name, pr.number, pr.title, prUrl);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
await notifyTaskFailed("fix-review-point", name, pr.number, pr.title, prUrl, output);
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
console.error(`[fix-review-point] tick error: ${err}`);
|
|
56
|
-
await notifyError("fix-review-point", name, err);
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
await tick();
|
|
60
|
-
setInterval(tick, POLLING_INTERVAL_MS);
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=fix-review-point.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fix-review-point.js","sourceRoot":"","sources":["../../src/workers/fix-review-point.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { getCurrentUser, getRepoInfo, listAllIssues } from "../gh.js";
|
|
2
|
-
import { syncDefaultBranch } from "../git.js";
|
|
3
|
-
import { isRunning, isShuttingDown, run } from "../process-manager.js";
|
|
4
|
-
import { notifyTaskCompleted, notifyTaskFailed, notifyError } from "../slack.js";
|
|
5
|
-
const POLLING_INTERVAL_MS = 5 * 60 * 1000;
|
|
6
|
-
const TASK_ID = -1;
|
|
7
|
-
export async function triageIssuesWorker(options) {
|
|
8
|
-
const assignee = await getCurrentUser();
|
|
9
|
-
const { owner, name, defaultBranch } = await getRepoInfo();
|
|
10
|
-
console.log(`[triage-issues] Polling issues every 5 minutes for ${name}`);
|
|
11
|
-
let firstRunResolve;
|
|
12
|
-
const firstRunPromise = options?.waitForFirstRun
|
|
13
|
-
? new Promise(resolve => { firstRunResolve = resolve; })
|
|
14
|
-
: undefined;
|
|
15
|
-
const tick = async () => {
|
|
16
|
-
if (isShuttingDown())
|
|
17
|
-
return;
|
|
18
|
-
try {
|
|
19
|
-
if (isRunning(TASK_ID))
|
|
20
|
-
return;
|
|
21
|
-
const issues = await listAllIssues(assignee);
|
|
22
|
-
const EXCLUDE_LABELS = ["cc-create-issue", "cc-update-issue", "cc-exec-issue", "cc-pr-created"];
|
|
23
|
-
const candidates = issues.filter(issue => !issue.labels.some(l => EXCLUDE_LABELS.includes(l.name)));
|
|
24
|
-
if (candidates.length === 0) {
|
|
25
|
-
firstRunResolve?.();
|
|
26
|
-
firstRunResolve = undefined;
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
const repoUrl = `https://github.com/${owner}/${name}`;
|
|
30
|
-
syncDefaultBranch(defaultBranch);
|
|
31
|
-
run("claude", ["--dangerously-skip-permissions", "-p", "/base-tools:triage-issues"], TASK_ID, "Triage Issues", "triage-issues", undefined, async (status, output) => {
|
|
32
|
-
if (status === "completed") {
|
|
33
|
-
await notifyTaskCompleted("triage-issues", name, TASK_ID, "Triage Issues", repoUrl);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
await notifyTaskFailed("triage-issues", name, TASK_ID, "Triage Issues", repoUrl, output);
|
|
37
|
-
}
|
|
38
|
-
firstRunResolve?.();
|
|
39
|
-
firstRunResolve = undefined;
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
console.error(`[triage-issues] tick error: ${err}`);
|
|
44
|
-
await notifyError("triage-issues", name, err);
|
|
45
|
-
firstRunResolve?.();
|
|
46
|
-
firstRunResolve = undefined;
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
await tick();
|
|
50
|
-
setInterval(tick, POLLING_INTERVAL_MS);
|
|
51
|
-
if (firstRunPromise)
|
|
52
|
-
await firstRunPromise;
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=triage-issues.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"triage-issues.js","sourceRoot":"","sources":["../../src/workers/triage-issues.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { getCurrentUser, getRepoInfo, listPullRequestsWithChecks, isCICompleted } from "../gh.js";
|
|
2
|
-
import { syncDefaultBranch } from "../git.js";
|
|
3
|
-
import { isRunning, isShuttingDown, run } from "../process-manager.js";
|
|
4
|
-
import { notifyTaskCompleted, notifyTaskFailed, notifyError } from "../slack.js";
|
|
5
|
-
import { removeAllAgentWorktrees } from "../worktree.js";
|
|
6
|
-
const POLLING_INTERVAL_MS = 5 * 60 * 1000;
|
|
7
|
-
const TASK_ID = -2;
|
|
8
|
-
export async function triagePrsWorker(options) {
|
|
9
|
-
const { owner, name, defaultBranch } = await getRepoInfo();
|
|
10
|
-
const user = await getCurrentUser();
|
|
11
|
-
console.log(`[triage-prs] Polling PRs every 5 minutes for ${name} (assignee: ${user})`);
|
|
12
|
-
let firstRunResolve;
|
|
13
|
-
const firstRunPromise = options?.waitForFirstRun
|
|
14
|
-
? new Promise(resolve => { firstRunResolve = resolve; })
|
|
15
|
-
: undefined;
|
|
16
|
-
const tick = async () => {
|
|
17
|
-
if (isShuttingDown())
|
|
18
|
-
return;
|
|
19
|
-
try {
|
|
20
|
-
if (isRunning(TASK_ID))
|
|
21
|
-
return;
|
|
22
|
-
const prs = await listPullRequestsWithChecks(user, { triageScope: true });
|
|
23
|
-
const candidates = prs.filter(pr => !pr.labels.some(l => l.name === "cc-fix-onetime") &&
|
|
24
|
-
isCICompleted(pr.statusCheckRollup));
|
|
25
|
-
if (candidates.length === 0) {
|
|
26
|
-
firstRunResolve?.();
|
|
27
|
-
firstRunResolve = undefined;
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const repoUrl = `https://github.com/${owner}/${name}`;
|
|
31
|
-
syncDefaultBranch(defaultBranch);
|
|
32
|
-
run("claude", ["--dangerously-skip-permissions", "-p", "/base-tools:triage-prs"], TASK_ID, "Triage PRs", "triage-prs", undefined, async (status, output) => {
|
|
33
|
-
await removeAllAgentWorktrees();
|
|
34
|
-
if (status === "completed") {
|
|
35
|
-
await notifyTaskCompleted("triage-prs", name, TASK_ID, "Triage PRs", repoUrl);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
await notifyTaskFailed("triage-prs", name, TASK_ID, "Triage PRs", repoUrl, output);
|
|
39
|
-
}
|
|
40
|
-
firstRunResolve?.();
|
|
41
|
-
firstRunResolve = undefined;
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
console.error(`[triage-prs] tick error: ${err}`);
|
|
46
|
-
await notifyError("triage-prs", name, err);
|
|
47
|
-
firstRunResolve?.();
|
|
48
|
-
firstRunResolve = undefined;
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
await tick();
|
|
52
|
-
setInterval(tick, POLLING_INTERVAL_MS);
|
|
53
|
-
if (firstRunPromise)
|
|
54
|
-
await firstRunPromise;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=triage-prs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"triage-prs.js","sourceRoot":"","sources":["../../src/workers/triage-prs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function updateIssueWorker(): Promise<void>;
|