claude-task-worker 0.88.0 → 0.90.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 (2) hide show
  1. package/dist/index.js +152 -159
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -583,6 +583,8 @@ __export(herdr_runner_exports, {
583
583
  PANE_OUTPUT_LINES: () => PANE_OUTPUT_LINES,
584
584
  PANE_READY_POLL_INTERVAL_MS: () => PANE_READY_POLL_INTERVAL_MS,
585
585
  PANE_READY_TIMEOUT_MS: () => PANE_READY_TIMEOUT_MS,
586
+ PROMPT_ACCEPT_POLL_INTERVAL_MS: () => PROMPT_ACCEPT_POLL_INTERVAL_MS,
587
+ PROMPT_ACCEPT_TIMEOUT_MS: () => PROMPT_ACCEPT_TIMEOUT_MS,
586
588
  buildHerdrTaskResult: () => buildHerdrTaskResult,
587
589
  createCompletionTracker: () => createCompletionTracker,
588
590
  observeAgentStatus: () => observeAgentStatus,
@@ -657,13 +659,43 @@ async function startHerdrTask({
657
659
  }
658
660
  await mod.agentStart(paneId, { name: toAgentName(label), args, readyTimeoutMs: timing?.agentStartReadyTimeoutMs });
659
661
  await mod.agentPrompt(paneId, prompt);
662
+ await ensurePromptAccepted(paneId, prompt, mod, timing);
660
663
  } catch (err) {
664
+ console.error(`[herdr-runner] failed to start task in pane ${paneId}: ${err}`);
661
665
  await mod.tabClose(tabId).catch(() => {
662
666
  });
663
667
  throw err;
664
668
  }
665
669
  return { paneId, tabId };
666
670
  }
671
+ async function ensurePromptAccepted(paneId, prompt, mod, timing) {
672
+ if (await waitForPromptAccepted(paneId, mod, timing)) return;
673
+ console.warn(`[herdr-runner] the prompt was not accepted in pane ${paneId} (claude stayed idle); resending it`);
674
+ await mod.agentPrompt(paneId, prompt);
675
+ if (await waitForPromptAccepted(paneId, mod, timing)) return;
676
+ throw new Error(
677
+ `the claude session in pane ${paneId} did not start the task after the prompt was submitted twice (a startup dialog most likely swallowed it)`
678
+ );
679
+ }
680
+ async function waitForPromptAccepted(paneId, mod, timing) {
681
+ const timeoutMs = timing?.promptAcceptTimeoutMs ?? PROMPT_ACCEPT_TIMEOUT_MS;
682
+ const pollIntervalMs = timing?.promptAcceptPollIntervalMs ?? PROMPT_ACCEPT_POLL_INTERVAL_MS;
683
+ const deadline = Date.now() + timeoutMs;
684
+ let loggedError = false;
685
+ for (; ; ) {
686
+ try {
687
+ const { agentStatus } = await mod.agentGet(paneId);
688
+ if (agentStatus === "working" || agentStatus === "done") return true;
689
+ } catch (err) {
690
+ if (!loggedError) {
691
+ console.error(`[herdr-runner] failed to read agent status for pane ${paneId} after the prompt: ${err}`);
692
+ loggedError = true;
693
+ }
694
+ }
695
+ if (Date.now() >= deadline) return false;
696
+ await sleep(pollIntervalMs);
697
+ }
698
+ }
667
699
  async function waitForPaneReady(paneId, mod, options) {
668
700
  const timeoutMs = options?.timeoutMs ?? PANE_READY_TIMEOUT_MS;
669
701
  const pollIntervalMs = options?.pollIntervalMs ?? PANE_READY_POLL_INTERVAL_MS;
@@ -769,7 +801,7 @@ async function stopHerdrTask(task, herdr, options) {
769
801
  function sleep(ms) {
770
802
  return new Promise((resolve3) => setTimeout(resolve3, ms));
771
803
  }
772
- var AGENT_POLL_INTERVAL_MS, PANE_OUTPUT_LINES, PANE_READY_TIMEOUT_MS, PANE_READY_POLL_INTERVAL_MS, CLAUDE_EXIT_TIMEOUT_MS, CLAUDE_EXIT_POLL_INTERVAL_MS;
804
+ var AGENT_POLL_INTERVAL_MS, PANE_OUTPUT_LINES, PANE_READY_TIMEOUT_MS, PANE_READY_POLL_INTERVAL_MS, PROMPT_ACCEPT_TIMEOUT_MS, PROMPT_ACCEPT_POLL_INTERVAL_MS, CLAUDE_EXIT_TIMEOUT_MS, CLAUDE_EXIT_POLL_INTERVAL_MS;
773
805
  var init_herdr_runner = __esm({
774
806
  "src/herdr-runner.ts"() {
775
807
  "use strict";
@@ -778,6 +810,8 @@ var init_herdr_runner = __esm({
778
810
  PANE_OUTPUT_LINES = 300;
779
811
  PANE_READY_TIMEOUT_MS = 30 * 1e3;
780
812
  PANE_READY_POLL_INTERVAL_MS = 200;
813
+ PROMPT_ACCEPT_TIMEOUT_MS = 20 * 1e3;
814
+ PROMPT_ACCEPT_POLL_INTERVAL_MS = 500;
781
815
  CLAUDE_EXIT_TIMEOUT_MS = 15 * 1e3;
782
816
  CLAUDE_EXIT_POLL_INTERVAL_MS = 200;
783
817
  }
@@ -4107,7 +4141,7 @@ var updateDesignMdWorker = createScheduledWorker({
4107
4141
  init_table();
4108
4142
 
4109
4143
  // src/commands/init.ts
4110
- import { mkdir as mkdir2, writeFile as writeFile2, readFile as readFile2, access } from "node:fs/promises";
4144
+ import { mkdir as mkdir2, writeFile as writeFile2, access } from "node:fs/promises";
4111
4145
 
4112
4146
  // src/commands/codegraph.ts
4113
4147
  import { mkdir, readFile, writeFile } from "node:fs/promises";
@@ -4195,122 +4229,6 @@ async function ensureCodegraphGitIgnore(logPrefix) {
4195
4229
  }
4196
4230
  }
4197
4231
 
4198
- // src/commands/design-md.ts
4199
- async function loadRunCommand2() {
4200
- return await Promise.resolve().then(() => (init_run_command(), run_command_exports));
4201
- }
4202
- var DESIGN_MD_PACKAGE = "@google/design.md";
4203
- async function installDesignMdCli(logPrefix) {
4204
- console.log(`[${logPrefix}] Installing DESIGN.md CLI (npm install -g ${DESIGN_MD_PACKAGE}@latest)...`);
4205
- try {
4206
- const { runCommand: runCommand2 } = await loadRunCommand2();
4207
- await runCommand2("npm", ["install", "-g", `${DESIGN_MD_PACKAGE}@latest`]);
4208
- console.log(`[${logPrefix}] DESIGN.md CLI installed.`);
4209
- return true;
4210
- } catch (err) {
4211
- console.error(`[${logPrefix}] Failed to install DESIGN.md CLI: ${err.message}`);
4212
- return false;
4213
- }
4214
- }
4215
-
4216
- // src/commands/pen.ts
4217
- async function loadRunCommand3() {
4218
- return await Promise.resolve().then(() => (init_run_command(), run_command_exports));
4219
- }
4220
- var PEN_PACKAGE = "@pen.dev/cli";
4221
- var LEGACY_PEN_PACKAGE = "@pencil.dev/cli";
4222
- async function installPenCli(logPrefix) {
4223
- console.log(`[${logPrefix}] Removing legacy Pen CLI (npm uninstall -g ${LEGACY_PEN_PACKAGE})...`);
4224
- const { runCommand: runCommand2 } = await loadRunCommand3();
4225
- try {
4226
- await runCommand2("npm", ["uninstall", "-g", LEGACY_PEN_PACKAGE]);
4227
- } catch (err) {
4228
- console.error(`[${logPrefix}] Skipped removing legacy Pen CLI: ${err.message}`);
4229
- }
4230
- console.log(`[${logPrefix}] Installing Pen CLI (npm install -g ${PEN_PACKAGE}@latest)...`);
4231
- try {
4232
- await runCommand2("npm", ["install", "-g", `${PEN_PACKAGE}@latest`]);
4233
- console.log(`[${logPrefix}] Pen CLI installed.`);
4234
- } catch (err) {
4235
- console.error(`[${logPrefix}] Failed to install Pen CLI: ${err.message}`);
4236
- return false;
4237
- }
4238
- await warnIfPenLoggedOut(logPrefix);
4239
- return true;
4240
- }
4241
- async function warnIfPenLoggedOut(logPrefix) {
4242
- const { runCommand: runCommand2 } = await loadRunCommand3();
4243
- try {
4244
- await runCommand2("pencil", ["status"]);
4245
- } catch {
4246
- console.log(
4247
- `[${logPrefix}] Pen CLI is not authenticated. Run \`pencil login\` (or set PEN_CLI_KEY) before using .pen designs.`
4248
- );
4249
- }
4250
- }
4251
-
4252
- // src/commands/install.ts
4253
- init_run_command();
4254
- var PLUGIN_NAME = "claude-task-worker";
4255
- var MARKETPLACE_NAME = "claude-task-worker";
4256
- var MARKETPLACE_SOURCE = "getty104/claude-task-worker";
4257
- var GLOBAL_NPM_PACKAGES = [PLUGIN_NAME, CODEGRAPH_PACKAGE, DESIGN_MD_PACKAGE, PEN_PACKAGE];
4258
- async function printGlobalPackageVersions(logPrefix) {
4259
- console.log(`[${logPrefix}] Installed versions:`);
4260
- try {
4261
- await runCommand("npm", ["ls", "-g", "--depth=0", ...GLOBAL_NPM_PACKAGES]);
4262
- } catch (err) {
4263
- console.error(`[${logPrefix}] Some packages are missing from the global install: ${err.message}`);
4264
- }
4265
- }
4266
- async function addMarketplace() {
4267
- console.log(`[install] Adding marketplace: ${MARKETPLACE_SOURCE}...`);
4268
- try {
4269
- await runCommand("claude", ["plugin", "marketplace", "add", MARKETPLACE_SOURCE]);
4270
- console.log("[install] Marketplace added.");
4271
- } catch (err) {
4272
- console.error(
4273
- `[install] Failed to add marketplace (already added is expected and safe to ignore): ${err.message}`
4274
- );
4275
- }
4276
- }
4277
- async function installPlugin() {
4278
- console.log(`[install] Installing plugin: ${PLUGIN_NAME}@${MARKETPLACE_NAME}...`);
4279
- try {
4280
- await runCommand("claude", ["plugin", "install", `${PLUGIN_NAME}@${MARKETPLACE_NAME}`]);
4281
- console.log("[install] Plugin installed. Restart your Claude Code session to apply.");
4282
- return true;
4283
- } catch (err) {
4284
- console.error(`[install] Failed to install plugin: ${err.message}`);
4285
- return false;
4286
- }
4287
- }
4288
- async function installCli() {
4289
- console.log("[install] Installing claude-task-worker CLI (npm install -g claude-task-worker@latest)...");
4290
- try {
4291
- await runCommand("npm", ["install", "-g", "claude-task-worker@latest"]);
4292
- console.log("[install] claude-task-worker CLI installed.");
4293
- return true;
4294
- } catch (err) {
4295
- console.error(`[install] Failed to install claude-task-worker CLI: ${err.message}`);
4296
- return false;
4297
- }
4298
- }
4299
- async function install() {
4300
- console.log("[install] Starting install...");
4301
- await addMarketplace();
4302
- const pluginOk = await installPlugin();
4303
- const cliOk = await installCli();
4304
- const codegraphOk = await installCodegraphCli("install");
4305
- const designMdOk = await installDesignMdCli("install");
4306
- const penOk = await installPenCli("install");
4307
- await printGlobalPackageVersions("install");
4308
- if (!pluginOk || !cliOk || !codegraphOk || !designMdOk || !penOk) {
4309
- process.exitCode = 1;
4310
- }
4311
- console.log("[install] Done.");
4312
- }
4313
-
4314
4232
  // src/commands/init.ts
4315
4233
  var LABELS = [
4316
4234
  { name: "cc-need-human-check", color: "eb1700" },
@@ -4410,45 +4328,6 @@ async function createConfig(force) {
4410
4328
  const result = await writeFileWithMode(CONFIG_PATH, JSON.stringify(initialConfig, null, 2), force);
4411
4329
  logWriteResult(result, CONFIG_PATH);
4412
4330
  }
4413
- var PROJECT_SETTINGS_PATH = ".claude/settings.json";
4414
- function mergePluginSettings(current) {
4415
- const marketplaces = { ...current.extraKnownMarketplaces ?? {} };
4416
- marketplaces[MARKETPLACE_NAME] = { source: { source: "github", repo: MARKETPLACE_SOURCE } };
4417
- const plugins = { ...current.enabledPlugins ?? {} };
4418
- plugins[`${PLUGIN_NAME}@${MARKETPLACE_NAME}`] = true;
4419
- return { ...current, extraKnownMarketplaces: marketplaces, enabledPlugins: plugins };
4420
- }
4421
- async function registerPluginInSettings() {
4422
- let current = {};
4423
- try {
4424
- const raw = await readFile2(PROJECT_SETTINGS_PATH, "utf-8");
4425
- const parsed = JSON.parse(raw);
4426
- if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
4427
- console.log(`[init] Skipped: ${PROJECT_SETTINGS_PATH} is not a JSON object`);
4428
- return;
4429
- }
4430
- current = parsed;
4431
- } catch (err) {
4432
- if (err.code !== "ENOENT") {
4433
- console.log(`[init] Skipped: failed to read ${PROJECT_SETTINGS_PATH}: ${err.message}`);
4434
- return;
4435
- }
4436
- }
4437
- const merged = mergePluginSettings(current);
4438
- if (JSON.stringify(merged) === JSON.stringify(current)) {
4439
- console.log(`[init] Already registered: ${PLUGIN_NAME}@${MARKETPLACE_NAME} in ${PROJECT_SETTINGS_PATH}`);
4440
- return;
4441
- }
4442
- try {
4443
- await mkdir2(".claude", { recursive: true });
4444
- await writeFile2(PROJECT_SETTINGS_PATH, `${JSON.stringify(merged, null, 2)}
4445
- `, "utf-8");
4446
- } catch (err) {
4447
- console.log(`[init] Skipped: failed to write ${PROJECT_SETTINGS_PATH}: ${err.message}`);
4448
- return;
4449
- }
4450
- console.log(`[init] Registered ${PLUGIN_NAME}@${MARKETPLACE_NAME} in ${PROJECT_SETTINGS_PATH}`);
4451
- }
4452
4331
  async function init(options = {}) {
4453
4332
  const force = options.force ?? false;
4454
4333
  console.log(`[init] Creating labels...${force ? " (force mode)" : ""}`);
@@ -4468,8 +4347,6 @@ async function init(options = {}) {
4468
4347
  await mkdir2(".github/workflows", { recursive: true });
4469
4348
  const workflowPath = ".github/workflows/assign-creator-on-cc-triage-scope.yml";
4470
4349
  logWriteResult(await writeFileWithMode(workflowPath, ASSIGN_CREATOR_WORKFLOW, force), workflowPath);
4471
- console.log("[init] Registering the plugin in project settings...");
4472
- await registerPluginInSettings();
4473
4350
  console.log("[init] Creating config file...");
4474
4351
  await createConfig(force);
4475
4352
  console.log("[init] Setting up CodeGraph...");
@@ -4478,6 +4355,122 @@ async function init(options = {}) {
4478
4355
  console.log("[init] Done.");
4479
4356
  }
4480
4357
 
4358
+ // src/commands/design-md.ts
4359
+ async function loadRunCommand2() {
4360
+ return await Promise.resolve().then(() => (init_run_command(), run_command_exports));
4361
+ }
4362
+ var DESIGN_MD_PACKAGE = "@google/design.md";
4363
+ async function installDesignMdCli(logPrefix) {
4364
+ console.log(`[${logPrefix}] Installing DESIGN.md CLI (npm install -g ${DESIGN_MD_PACKAGE}@latest)...`);
4365
+ try {
4366
+ const { runCommand: runCommand2 } = await loadRunCommand2();
4367
+ await runCommand2("npm", ["install", "-g", `${DESIGN_MD_PACKAGE}@latest`]);
4368
+ console.log(`[${logPrefix}] DESIGN.md CLI installed.`);
4369
+ return true;
4370
+ } catch (err) {
4371
+ console.error(`[${logPrefix}] Failed to install DESIGN.md CLI: ${err.message}`);
4372
+ return false;
4373
+ }
4374
+ }
4375
+
4376
+ // src/commands/pen.ts
4377
+ async function loadRunCommand3() {
4378
+ return await Promise.resolve().then(() => (init_run_command(), run_command_exports));
4379
+ }
4380
+ var PEN_PACKAGE = "@pen.dev/cli";
4381
+ var LEGACY_PEN_PACKAGE = "@pencil.dev/cli";
4382
+ async function installPenCli(logPrefix) {
4383
+ console.log(`[${logPrefix}] Removing legacy Pen CLI (npm uninstall -g ${LEGACY_PEN_PACKAGE})...`);
4384
+ const { runCommand: runCommand2 } = await loadRunCommand3();
4385
+ try {
4386
+ await runCommand2("npm", ["uninstall", "-g", LEGACY_PEN_PACKAGE]);
4387
+ } catch (err) {
4388
+ console.error(`[${logPrefix}] Skipped removing legacy Pen CLI: ${err.message}`);
4389
+ }
4390
+ console.log(`[${logPrefix}] Installing Pen CLI (npm install -g ${PEN_PACKAGE}@latest)...`);
4391
+ try {
4392
+ await runCommand2("npm", ["install", "-g", `${PEN_PACKAGE}@latest`]);
4393
+ console.log(`[${logPrefix}] Pen CLI installed.`);
4394
+ } catch (err) {
4395
+ console.error(`[${logPrefix}] Failed to install Pen CLI: ${err.message}`);
4396
+ return false;
4397
+ }
4398
+ await warnIfPenLoggedOut(logPrefix);
4399
+ return true;
4400
+ }
4401
+ async function warnIfPenLoggedOut(logPrefix) {
4402
+ const { runCommand: runCommand2 } = await loadRunCommand3();
4403
+ try {
4404
+ await runCommand2("pencil", ["status"]);
4405
+ } catch {
4406
+ console.log(
4407
+ `[${logPrefix}] Pen CLI is not authenticated. Run \`pencil login\` (or set PEN_CLI_KEY) before using .pen designs.`
4408
+ );
4409
+ }
4410
+ }
4411
+
4412
+ // src/commands/install.ts
4413
+ init_run_command();
4414
+ var PLUGIN_NAME = "claude-task-worker";
4415
+ var MARKETPLACE_NAME = "claude-task-worker";
4416
+ var MARKETPLACE_SOURCE = "getty104/claude-task-worker";
4417
+ var GLOBAL_NPM_PACKAGES = [PLUGIN_NAME, CODEGRAPH_PACKAGE, DESIGN_MD_PACKAGE, PEN_PACKAGE];
4418
+ async function printGlobalPackageVersions(logPrefix) {
4419
+ console.log(`[${logPrefix}] Installed versions:`);
4420
+ try {
4421
+ await runCommand("npm", ["ls", "-g", "--depth=0", ...GLOBAL_NPM_PACKAGES]);
4422
+ } catch (err) {
4423
+ console.error(`[${logPrefix}] Some packages are missing from the global install: ${err.message}`);
4424
+ }
4425
+ }
4426
+ async function addMarketplace() {
4427
+ console.log(`[install] Adding marketplace: ${MARKETPLACE_SOURCE}...`);
4428
+ try {
4429
+ await runCommand("claude", ["plugin", "marketplace", "add", MARKETPLACE_SOURCE]);
4430
+ console.log("[install] Marketplace added.");
4431
+ } catch (err) {
4432
+ console.error(
4433
+ `[install] Failed to add marketplace (already added is expected and safe to ignore): ${err.message}`
4434
+ );
4435
+ }
4436
+ }
4437
+ async function installPlugin() {
4438
+ console.log(`[install] Installing plugin: ${PLUGIN_NAME}@${MARKETPLACE_NAME}...`);
4439
+ try {
4440
+ await runCommand("claude", ["plugin", "install", `${PLUGIN_NAME}@${MARKETPLACE_NAME}`]);
4441
+ console.log("[install] Plugin installed. Restart your Claude Code session to apply.");
4442
+ return true;
4443
+ } catch (err) {
4444
+ console.error(`[install] Failed to install plugin: ${err.message}`);
4445
+ return false;
4446
+ }
4447
+ }
4448
+ async function installCli() {
4449
+ console.log("[install] Installing claude-task-worker CLI (npm install -g claude-task-worker@latest)...");
4450
+ try {
4451
+ await runCommand("npm", ["install", "-g", "claude-task-worker@latest"]);
4452
+ console.log("[install] claude-task-worker CLI installed.");
4453
+ return true;
4454
+ } catch (err) {
4455
+ console.error(`[install] Failed to install claude-task-worker CLI: ${err.message}`);
4456
+ return false;
4457
+ }
4458
+ }
4459
+ async function install() {
4460
+ console.log("[install] Starting install...");
4461
+ await addMarketplace();
4462
+ const pluginOk = await installPlugin();
4463
+ const cliOk = await installCli();
4464
+ const codegraphOk = await installCodegraphCli("install");
4465
+ const designMdOk = await installDesignMdCli("install");
4466
+ const penOk = await installPenCli("install");
4467
+ await printGlobalPackageVersions("install");
4468
+ if (!pluginOk || !cliOk || !codegraphOk || !designMdOk || !penOk) {
4469
+ process.exitCode = 1;
4470
+ }
4471
+ console.log("[install] Done.");
4472
+ }
4473
+
4481
4474
  // src/commands/update.ts
4482
4475
  init_run_command();
4483
4476
  var PLUGIN_NAME2 = "claude-task-worker";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-task-worker",
3
- "version": "0.88.0",
3
+ "version": "0.90.0",
4
4
  "description": "CLI tool that polls GitHub Issues/PRs and delegates work to Claude CLI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",