claude-task-worker 0.107.0 → 0.109.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 (3) hide show
  1. package/README.md +14 -1
  2. package/dist/index.js +65 -33
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -122,7 +122,7 @@ claude-task-worker init --force # 強制上書き
122
122
  ## コマンド
123
123
 
124
124
  ```bash
125
- claude-task-worker <command> [--epic <issue-number>]... [--label <label>]... [--project <name>]... [--cloud]
125
+ claude-task-worker <command> [--epic <issue-number>]... [--label <label>]... [--project <name>]... [--cloud] [--debug]
126
126
  ```
127
127
 
128
128
  | コマンド | 内容 |
@@ -210,6 +210,19 @@ npx claude-task-worker cloud-setup
210
210
 
211
211
  詳細は [`docs/prd-cloud-worker-execution.md`](./docs/prd-cloud-worker-execution.md) を参照。
212
212
 
213
+ ### `--debug`
214
+
215
+ 各タスクの最終報告を対象 Issue/PR へコメントとして残す。ローカル実行(`default` / `herdr`)でもクラウド実行(`--cloud`)でも使える。
216
+
217
+ ```bash
218
+ claude-task-worker exec-issue --debug
219
+ claude-task-worker exec-issue --cloud --debug
220
+ ```
221
+
222
+ 既定(`--debug` なし)では最終報告は Slack 通知にのみ載り、Issue/PR にはコメントされない。毎タスク投稿すると Issue/PR がワーカーの実行ログで埋まるため。
223
+
224
+ 投稿の担当は実行形態で違う。ローカルはワーカーが報告そのもの(`claude -p` の stdout / transcript)を持っているのでワーカーが投稿し、クラウドはワーカーに報告が届かないのでセッション自身に投稿させる(ワーカーはそれを回収して Slack へ載せる)。定期ワーカー(`update-*`)の投稿先は実行記録PR(`ctw-last-run-<ワーカー名>`)。クラウド実行の完了検知(`cc-cloud-done`)はフラグの有無に関わらず従来どおり動く。
225
+
213
226
  ### Pen CLI のログイン
214
227
 
215
228
  `.pen` を扱うスキルは Pen CLI の認証を必要とする。UIデザイン先行ワークフローを使うなら一度ログインしておく。
package/dist/index.js CHANGED
@@ -1609,6 +1609,11 @@ async function addLabel(type, number, label) {
1609
1609
  }
1610
1610
  });
1611
1611
  }
1612
+ async function addAssignee(type, number, login) {
1613
+ await withRetry(async () => {
1614
+ await execGh([type, "edit", String(number), "--add-assignee", login]);
1615
+ });
1616
+ }
1612
1617
  async function hasLabel(type, number, label) {
1613
1618
  return withRetry(async () => {
1614
1619
  const output = await execGh([type, "view", String(number), "--json", "labels"]);
@@ -1668,10 +1673,8 @@ async function commentOnPR(prNumber, body) {
1668
1673
  async function commentOnIssue(issueNumber, body) {
1669
1674
  await execGh(["issue", "comment", String(issueNumber), "--body", body]);
1670
1675
  }
1671
- async function createPullRequest(base, head, title, body, options) {
1676
+ async function createPullRequest(base, head, title, body) {
1672
1677
  const args = ["pr", "create", "--base", base, "--head", head, "--title", title, "--body", body];
1673
- for (const label of options?.labels ?? []) args.push("--label", label);
1674
- if (options?.assignee) args.push("--assignee", options.assignee);
1675
1678
  const url = await execGh(args);
1676
1679
  const matched = url.match(/\/pull\/(\d+)/);
1677
1680
  if (!matched) throw new Error(`gh pr create returned an unexpected output: ${url}`);
@@ -1732,6 +1735,13 @@ function hasCloudFlag() {
1732
1735
  }
1733
1736
  return cachedCloudFlag;
1734
1737
  }
1738
+ var cachedDebugFlag;
1739
+ function hasDebugFlag() {
1740
+ if (cachedDebugFlag === void 0) {
1741
+ cachedDebugFlag = process.argv.includes("--debug");
1742
+ }
1743
+ return cachedDebugFlag;
1744
+ }
1735
1745
  function assertCloudCompatibleCommand(command) {
1736
1746
  if (FLAG_INCOMPATIBLE_COMMANDS.includes(command)) {
1737
1747
  console.error(`[worker] --cloud cannot be used with the "${command}" command`);
@@ -2585,12 +2595,12 @@ function buildClaudeArgs({
2585
2595
  function buildCloudCreateArgs(commonArgs, prompt) {
2586
2596
  return ["--cloud", prompt, ...commonArgs];
2587
2597
  }
2588
- function appendCloudDoneInstruction(prompt, target) {
2598
+ function appendCloudDoneInstruction(prompt, target, debug = false) {
2589
2599
  const targetLabel = target.type === "issue" ? `Issue #${target.number}` : `PR #${target.number}`;
2590
2600
  const checkoutInstruction = buildCloudCheckoutInstruction(target);
2591
2601
  const worktreeInstruction = buildCloudWorktreeInstruction(prompt);
2592
- const reportInstruction = `\`${CLOUD_DONE_LABEL}\` \u30E9\u30D9\u30EB\u3092\u4ED8\u3051\u308B\u76F4\u524D\u306B\u3001${targetLabel} \u3078 \`${CLOUD_REPORT_HEADING}\` \u3092\u898B\u51FA\u3057\u3068\u3059\u308B\u30B3\u30E1\u30F3\u30C8\u30921\u4EF6\u6295\u7A3F\u3057\u3001\u672C\u6587\u306B\u6700\u7D42\u5831\u544A\uFF08\u5B8C\u4E86\u30FB\u4E2D\u65AD\u306B\u304B\u304B\u308F\u3089\u305A\uFF09\u3092\u66F8\u304F\u3053\u3068\u3002GitHub MCP\uFF08\`add_issue_comment\`\uFF09\u3092\u512A\u5148\u3057\u3001\u5931\u6557\u3057\u305F\u5834\u5408\u306E\u307F \`gh ${target.type} comment ${target.number} --body-file -\` \u3078\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3059\u308B\u3053\u3068\uFF08\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u306F1\u56DE\u307E\u3067\uFF09\u3002\u30EF\u30FC\u30AB\u30FC\u306F\u3053\u306E\u30B3\u30E1\u30F3\u30C8\u3092\u6700\u7D42\u30EC\u30DD\u30FC\u30C8\u3068\u3057\u3066\u56DE\u53CE\u3057 Slack \u901A\u77E5\u306B\u8F09\u305B\u308B\u3002`;
2593
- const labelInstruction = `\u4E0A\u8A18\u30B3\u30E1\u30F3\u30C8\u306E\u6295\u7A3F\u5F8C\u3001\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u6700\u5F8C\u306E\u64CD\u4F5C\u3068\u3057\u3066 ${targetLabel} \u306B \`${CLOUD_DONE_LABEL}\` \u30E9\u30D9\u30EB\u3092\u4ED8\u4E0E\u3059\u308B\u3053\u3068\u3002GitHub MCP\uFF08\`issue_write\` / method: \`update\`\uFF09\u3092\u512A\u5148\u3057\u3001\u5931\u6557\u3057\u305F\u5834\u5408\u306E\u307F \`gh ${target.type} edit ${target.number} --add-label ${CLOUD_DONE_LABEL}\` \u3078\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3059\u308B\u3053\u3068\uFF08\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u306F1\u56DE\u307E\u3067\uFF09\u3002\u30EF\u30FC\u30AB\u30FC\u306F\u3053\u306E\u30E9\u30D9\u30EB\u3067\u30BF\u30B9\u30AF\u306E\u7D42\u4E86\u3092\u691C\u77E5\u3057\u3066\u304A\u308A\u3001\u4ED8\u4E0E\u3055\u308C\u306A\u3044\u3068\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u307E\u3067\u5B8C\u4E86\u6271\u3044\u306B\u306A\u3089\u306A\u3044\u3002`;
2602
+ const reportInstruction = debug ? `\`${CLOUD_DONE_LABEL}\` \u30E9\u30D9\u30EB\u3092\u4ED8\u3051\u308B\u76F4\u524D\u306B\u3001${targetLabel} \u3078 \`${CLOUD_REPORT_HEADING}\` \u3092\u898B\u51FA\u3057\u3068\u3059\u308B\u30B3\u30E1\u30F3\u30C8\u30921\u4EF6\u6295\u7A3F\u3057\u3001\u672C\u6587\u306B\u6700\u7D42\u5831\u544A\uFF08\u5B8C\u4E86\u30FB\u4E2D\u65AD\u306B\u304B\u304B\u308F\u3089\u305A\uFF09\u3092\u66F8\u304F\u3053\u3068\u3002GitHub MCP\uFF08\`add_issue_comment\`\uFF09\u3092\u512A\u5148\u3057\u3001\u5931\u6557\u3057\u305F\u5834\u5408\u306E\u307F \`gh ${target.type} comment ${target.number} --body-file -\` \u3078\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3059\u308B\u3053\u3068\uFF08\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u306F1\u56DE\u307E\u3067\uFF09\u3002\u30EF\u30FC\u30AB\u30FC\u306F\u3053\u306E\u30B3\u30E1\u30F3\u30C8\u3092\u6700\u7D42\u30EC\u30DD\u30FC\u30C8\u3068\u3057\u3066\u56DE\u53CE\u3057 Slack \u901A\u77E5\u306B\u8F09\u305B\u308B\u3002` : "";
2603
+ const labelInstruction = `${debug ? "\u4E0A\u8A18\u30B3\u30E1\u30F3\u30C8\u306E\u6295\u7A3F\u5F8C\u3001" : ""}\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u6700\u5F8C\u306E\u64CD\u4F5C\u3068\u3057\u3066 ${targetLabel} \u306B \`${CLOUD_DONE_LABEL}\` \u30E9\u30D9\u30EB\u3092\u4ED8\u4E0E\u3059\u308B\u3053\u3068\u3002GitHub MCP\uFF08\`issue_write\` / method: \`update\`\uFF09\u3092\u512A\u5148\u3057\u3001\u5931\u6557\u3057\u305F\u5834\u5408\u306E\u307F \`gh ${target.type} edit ${target.number} --add-label ${CLOUD_DONE_LABEL}\` \u3078\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3059\u308B\u3053\u3068\uFF08\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u306F1\u56DE\u307E\u3067\uFF09\u3002\u30EF\u30FC\u30AB\u30FC\u306F\u3053\u306E\u30E9\u30D9\u30EB\u3067\u30BF\u30B9\u30AF\u306E\u7D42\u4E86\u3092\u691C\u77E5\u3057\u3066\u304A\u308A\u3001\u4ED8\u4E0E\u3055\u308C\u306A\u3044\u3068\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u307E\u3067\u5B8C\u4E86\u6271\u3044\u306B\u306A\u3089\u306A\u3044\u3002`;
2594
2604
  return [prompt, checkoutInstruction, worktreeInstruction, reportInstruction, labelInstruction].filter((part) => part !== "").join("\n\n");
2595
2605
  }
2596
2606
  var CLOUD_WORKTREE_EXEMPT_SKILLS = ["exec-issue", "fix-review-point", "create-ui-design"];
@@ -2609,7 +2619,7 @@ function buildCloudGitHubAccessInstruction() {
2609
2619
  function buildCloudToolRestriction() {
2610
2620
  return `\u30AF\u30E9\u30A6\u30C9\u5B9F\u884C\u3067\u306F \`--disallowedTools\` \u30D5\u30E9\u30B0\u306B\u3088\u308B\u30C4\u30FC\u30EB\u5236\u9650\u304C\u53CD\u6620\u3055\u308C\u306A\u3044\u305F\u3081\u3001\u4EE5\u4E0B\u306E\u30C4\u30FC\u30EB\u3092\u4F7F\u308F\u306A\u3044\u3053\u3068: ${DISALLOWED_TOOLS.join(", ")}`;
2611
2621
  }
2612
- function buildCloudPrompt(prompt, model, target) {
2622
+ function buildCloudPrompt(prompt, model, target, debug = false) {
2613
2623
  const principles = `\u4EE5\u4E0B\u306F\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u5B9F\u884C\u539F\u5247\u3067\u3042\u308B\u3002\u30AF\u30E9\u30A6\u30C9\u5B9F\u884C\u3067\u306F\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30F3\u30D7\u30C8\u306B\u3088\u308B\u6CE8\u5165\u304C\u53CD\u6620\u3055\u308C\u306A\u3044\u305F\u3081\u3001\u30D7\u30ED\u30F3\u30D7\u30C8\u672C\u6587\u3068\u3057\u3066\u6E21\u3057\u3066\u3044\u308B\u3002
2614
2624
 
2615
2625
  ${systemPromptFor(model)}
@@ -2620,7 +2630,7 @@ ${buildCloudGitHubAccessInstruction()}`;
2620
2630
  const withPrinciples = `${prompt}
2621
2631
 
2622
2632
  ${principles}`;
2623
- return target ? appendCloudDoneInstruction(withPrinciples, target) : withPrinciples;
2633
+ return target ? appendCloudDoneInstruction(withPrinciples, target, debug) : withPrinciples;
2624
2634
  }
2625
2635
  function shellQuote2(value) {
2626
2636
  return `'${value.replace(/'/g, "'\\''")}'`;
@@ -2819,6 +2829,21 @@ async function finishTask(id, result, onComplete) {
2819
2829
  pruneTaskHistory();
2820
2830
  renderTable();
2821
2831
  }
2832
+ function onCompleteWithDebugReport(onComplete, target) {
2833
+ if (!target || !hasDebugFlag()) return onComplete;
2834
+ return async (status, output, cloudSessionId) => {
2835
+ const body = output.trim();
2836
+ if (body !== "") {
2837
+ const comment = target.type === "issue" ? commentOnIssue : commentOnPR;
2838
+ await comment(target.number, `${CLOUD_REPORT_HEADING}
2839
+
2840
+ ${body}`).catch(
2841
+ (err) => console.error(`[worker] failed to post the debug report to ${target.type} #${target.number}: ${err}`)
2842
+ );
2843
+ }
2844
+ await onComplete?.(status, output, cloudSessionId);
2845
+ };
2846
+ }
2822
2847
  function resolveProjectName(cwd = process.cwd()) {
2823
2848
  const injected = process.env.CTW_PROJECT_NAME;
2824
2849
  if (injected && injected.length > 0) return injected;
@@ -2992,7 +3017,8 @@ async function createCloudSession(args, initialPrompt, cwd, env) {
2992
3017
  }
2993
3018
  async function runViaCloud(args, prompt, id, onComplete, cwd, env, cloudTarget, model) {
2994
3019
  herdrTasks.set(id, { paneId: "", tabId: "" });
2995
- const initialPrompt = buildCloudPrompt(prompt, model ?? "", cloudTarget);
3020
+ const debug = hasDebugFlag();
3021
+ const initialPrompt = buildCloudPrompt(prompt, model ?? "", cloudTarget, debug);
2996
3022
  let result;
2997
3023
  let cloudSessionId;
2998
3024
  try {
@@ -3010,7 +3036,7 @@ async function runViaCloud(args, prompt, id, onComplete, cwd, env, cloudTarget,
3010
3036
  });
3011
3037
  let reportBody = null;
3012
3038
  const startedAt = tasks.get(id)?.startedAt;
3013
- if (startedAt) {
3039
+ if (debug && startedAt) {
3014
3040
  try {
3015
3041
  reportBody = await findCommentSince(targetNumber, startedAt, CLOUD_REPORT_HEADING);
3016
3042
  } catch (err) {
@@ -3080,8 +3106,9 @@ function run(command, args, id, title, workerName, path2, onComplete, cwd, env,
3080
3106
  void runViaCloud(args, prompt ?? "", id, onComplete, cwd, env, cloudTarget, model);
3081
3107
  return;
3082
3108
  }
3109
+ const onCompleteWithReport = onCompleteWithDebugReport(onComplete, cloudTarget);
3083
3110
  if (getRunMode() === "herdr") {
3084
- void runViaHerdr(args, prompt ?? "", id, onComplete, cwd, env);
3111
+ void runViaHerdr(args, prompt ?? "", id, onCompleteWithReport, cwd, env);
3085
3112
  return;
3086
3113
  }
3087
3114
  const child = spawn(command, args, {
@@ -3117,12 +3144,12 @@ function run(command, args, id, title, workerName, path2, onComplete, cwd, env,
3117
3144
  Buffer.concat(outputChunks).toString("utf-8"),
3118
3145
  Buffer.concat(stderrChunks).toString("utf-8").slice(-STDERR_TAIL_LIMIT)
3119
3146
  );
3120
- await finishTask(id, result, onComplete);
3147
+ await finishTask(id, result, onCompleteWithReport);
3121
3148
  childProcesses.delete(id);
3122
3149
  });
3123
3150
  child.on("error", async (err) => {
3124
3151
  console.error(`[worker] failed to spawn process for #${id}: ${err.message}`);
3125
- await finishTask(id, { status: "failed", output: err.message }, onComplete);
3152
+ await finishTask(id, { status: "failed", output: err.message }, onCompleteWithReport);
3126
3153
  childProcesses.delete(id);
3127
3154
  });
3128
3155
  }
@@ -3656,11 +3683,12 @@ async function notifyError(workerName, repoName, error) {
3656
3683
  }
3657
3684
 
3658
3685
  // src/worktree.ts
3659
- import { execFile as execFile2 } from "node:child_process";
3686
+ import { createRequire as createRequire3 } from "node:module";
3660
3687
  import { promisify as promisify3 } from "node:util";
3661
3688
  import { readdir, rm, stat } from "node:fs/promises";
3662
3689
  import { basename as basename2, resolve as resolve2, sep } from "node:path";
3663
- var execFileAsync2 = promisify3(execFile2);
3690
+ var childProcess3 = createRequire3(import.meta.url)("node:child_process");
3691
+ var execFileAsync2 = (command, args) => promisify3(childProcess3.execFile)(command, args);
3664
3692
  var WORKTREES_DIR = ".claude/worktrees";
3665
3693
  function isManagedWorktreePath(path2) {
3666
3694
  return resolve2(path2).startsWith(resolve2(WORKTREES_DIR) + sep);
@@ -3984,7 +4012,9 @@ function createIssuePollingWorker(config) {
3984
4012
  buildClaudeEnv(mode, cloud),
3985
4013
  execution.prompt,
3986
4014
  cloud,
3987
- cloud ? { type: "issue", number: issue.number } : void 0,
4015
+ // クラウドでは cc-cloud-done の探索先、ローカルでは --debug の報告コメントの
4016
+ // 投稿先。どちらも対象は同じ Issue なので実行形態で出し分けない。
4017
+ { type: "issue", number: issue.number },
3988
4018
  model
3989
4019
  );
3990
4020
  } catch (err) {
@@ -4241,7 +4271,9 @@ function createPrPollingWorker(config) {
4241
4271
  buildClaudeEnv(mode, isCloud),
4242
4272
  execution.prompt,
4243
4273
  isCloud,
4244
- isCloud ? { type: "pr", number: pr.number, onBranch: true } : void 0,
4274
+ // クラウドでは cc-cloud-done の探索先、ローカルでは --debug の報告コメントの
4275
+ // 投稿先。onBranch は `--on-branch` を渡したか(=クラウドのみ)を表す。
4276
+ { type: "pr", number: pr.number, onBranch: isCloud },
4245
4277
  model
4246
4278
  );
4247
4279
  } catch (err) {
@@ -4678,9 +4710,10 @@ var applyUiDesignWorker = async (opts = {}) => {
4678
4710
  };
4679
4711
 
4680
4712
  // src/last-run-pr.ts
4681
- import { execFile as execFile3 } from "node:child_process";
4713
+ import { createRequire as createRequire4 } from "node:module";
4682
4714
  import { promisify as promisify4 } from "node:util";
4683
- var execFileAsync3 = promisify4(execFile3);
4715
+ var childProcess4 = createRequire4(import.meta.url)("node:child_process");
4716
+ var execFileAsync3 = (command, args) => promisify4(childProcess4.execFile)(command, args);
4684
4717
  var CONFIG_FILE = "claude-task-worker.json";
4685
4718
  var LABEL_TRIAGE_SCOPE2 = "cc-triage-scope";
4686
4719
  function lastRunBranchName(workerName) {
@@ -4720,18 +4753,14 @@ async function publishLastRunPr(workerName, defaultBranch, at) {
4720
4753
  await git(cwd, ["commit", "-m", lastRunPrTitle(workerName)]);
4721
4754
  await git(cwd, ["push", "--force", "origin", `HEAD:refs/heads/${branch}`]);
4722
4755
  const existing = await findOpenPrNumberByHeadRef(branch);
4723
- if (existing !== null) {
4724
- console.log(`[${workerName}] updated lastRun PR #${existing}`);
4725
- return existing;
4726
- }
4727
- const prNumber = await createPullRequest(
4728
- defaultBranch,
4729
- branch,
4730
- lastRunPrTitle(workerName),
4731
- lastRunPrBody(workerName, at),
4732
- { labels: [LABEL_TRIAGE_SCOPE2], assignee: await getCurrentUser() }
4756
+ const prNumber = existing ?? await createPullRequest(defaultBranch, branch, lastRunPrTitle(workerName), lastRunPrBody(workerName, at));
4757
+ console.log(`[${workerName}] ${existing !== null ? "updated" : "opened"} lastRun PR #${prNumber}`);
4758
+ await addLabel("pr", prNumber, LABEL_TRIAGE_SCOPE2).catch(
4759
+ (err) => console.error(`[${workerName}] addLabel ${LABEL_TRIAGE_SCOPE2} failed for PR #${prNumber}: ${err}`)
4760
+ );
4761
+ await addAssignee("pr", prNumber, await getCurrentUser()).catch(
4762
+ (err) => console.error(`[${workerName}] addAssignee failed for PR #${prNumber}: ${err}`)
4733
4763
  );
4734
- console.log(`[${workerName}] opened lastRun PR #${prNumber}`);
4735
4764
  return prNumber;
4736
4765
  } finally {
4737
4766
  await removeWorktree(branch).catch((err) => console.error(`[${workerName}] removeWorktree failed: ${err}`));
@@ -4837,7 +4866,9 @@ function createScheduledWorker(config) {
4837
4866
  buildClaudeEnv(mode, cloud),
4838
4867
  execution.prompt,
4839
4868
  cloud,
4840
- cloud && lastRunPr !== null ? { type: "pr", number: lastRunPr } : void 0,
4869
+ // 定期ワーカーは Issue/PR を起点に走らないため、クラウドの cc-cloud-done
4870
+ // ローカル --debug の報告コメントも実行記録PRを置き先にする。
4871
+ lastRunPr !== null ? { type: "pr", number: lastRunPr } : void 0,
4841
4872
  model
4842
4873
  );
4843
4874
  } catch (err) {
@@ -5491,9 +5522,9 @@ function version() {
5491
5522
  }
5492
5523
 
5493
5524
  // src/index.ts
5494
- import { execFile as execFile4 } from "node:child_process";
5525
+ import { execFile as execFile2 } from "node:child_process";
5495
5526
  import { promisify as promisify5 } from "node:util";
5496
- var execFileAsync4 = promisify5(execFile4);
5527
+ var execFileAsync4 = promisify5(execFile2);
5497
5528
  var WORKERS = {
5498
5529
  "exec-issue": execIssueWorker,
5499
5530
  "fix-review-point": fixReviewPointWorker,
@@ -5543,6 +5574,7 @@ Workers:
5543
5574
 
5544
5575
  Options:
5545
5576
  --project <name> Dispatch to project(s) via herdr instead of running the worker locally. Accepts a project name, a project group name, or "all". Repeatable.
5577
+ --debug Post each task's final report as a comment on the target Issue/PR (off by default; the report is only sent to Slack). Works in both local and --cloud runs.
5546
5578
  --epic <number> Limit issue-based workers to sub-issues of the specified epic issue. Repeatable: any matching parent (OR).
5547
5579
  --label <name> Limit issue-based workers to issues that also carry the specified label. Repeatable: all must be present (AND).
5548
5580
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-task-worker",
3
- "version": "0.107.0",
3
+ "version": "0.109.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",