claude-task-worker 0.20.0 → 0.22.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 +35 -14
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -595,12 +595,12 @@ async function getIssueState(issueNumber) {
595
595
  const parsed = JSON.parse(output);
596
596
  return parsed.state;
597
597
  }
598
- async function findPrNumberClosingIssue(issueNumber) {
598
+ async function findPrNumberClosingIssue(issueNumber, expectedHeadRefName) {
599
599
  const { owner, name } = await getRepoInfo();
600
600
  const query = `query($owner: String!, $name: String!, $number: Int!) {
601
601
  repository(owner: $owner, name: $name) {
602
602
  issue(number: $number) {
603
- closedByPullRequestsReferences(first: 10, includeClosedPrs: true) { nodes { number state } }
603
+ closedByPullRequestsReferences(first: 10, includeClosedPrs: true) { nodes { number state headRefName } }
604
604
  }
605
605
  }
606
606
  }`;
@@ -618,7 +618,9 @@ async function findPrNumberClosingIssue(issueNumber) {
618
618
  ]);
619
619
  const parsed = JSON.parse(output);
620
620
  const nodes = parsed?.data?.repository?.issue?.closedByPullRequestsReferences?.nodes ?? [];
621
- const validPr = nodes.find((node) => node.state === "MERGED" || node.state === "OPEN");
621
+ const validPr = nodes.find(
622
+ (node) => (node.state === "MERGED" || node.state === "OPEN") && node.headRefName === expectedHeadRefName
623
+ );
622
624
  return validPr ? validPr.number : null;
623
625
  }
624
626
  async function getIssueSubIssuesSummary(issueNumber) {
@@ -745,15 +747,10 @@ async function createLabel(name, color, force) {
745
747
 
746
748
  // src/claude-args.ts
747
749
  var DISALLOWED_TOOLS = [
748
- // 遅延 / yield: 後続ウェイクアップ前提。print モードには再起動ループが無いため、
750
+ // 遅延 / yield: 後続ウェイクアップ前提。print モードではウェイクアップが発火せず、
749
751
  // 呼ぶと処理未完のままプロセスが終了する。
750
752
  "Monitor",
751
753
  "ScheduleWakeup",
752
- // SendMessage は過去に起動したサブエージェントをバックグラウンドでしか再開できず、
753
- // 「完了通知を待ちます」でターンを終える誘因になる(通知が届く前にプロセスが正常終了し、
754
- // PR未作成のまま完了扱いになる事故の実例あり)。未完のサブエージェントへの追加指示は
755
- // フォアグラウンドの新規 Agent 起動で代替させる。
756
- "SendMessage",
757
754
  // 対話 / 承認: 自律実行セッションには回答・承認するユーザーが存在しない。
758
755
  "AskUserQuestion",
759
756
  "EnterPlanMode",
@@ -769,6 +766,17 @@ var DISALLOWED_TOOLS = [
769
766
  "EnterWorktree"
770
767
  ];
771
768
  var DISALLOWED_TOOLS_ARG = DISALLOWED_TOOLS.join(",");
769
+ var CLAUDE_SPAWN_ENV = {
770
+ CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1",
771
+ CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS: "0"
772
+ };
773
+ var SYSTEM_PROMPT = `\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F \`claude-task-worker\` \u306E\u30EF\u30FC\u30AB\u30FC\u304B\u3089 \`claude -p\`\uFF08\u975E\u5BFE\u8A71 print \u30E2\u30FC\u30C9\uFF09\u3067\u81EA\u52D5\u8D77\u52D5\u3055\u308C\u3066\u3044\u308B\u3002\u30E6\u30FC\u30B6\u30FC\u3078\u306E\u78BA\u8A8D\u30FB\u8CEA\u554F\u306F\u884C\u308F\u305A\uFF08\u56DE\u7B54\u3059\u308B\u30E6\u30FC\u30B6\u30FC\u306F\u5B58\u5728\u3057\u306A\u3044\uFF09\u3001\u8D77\u52D5\u3055\u308C\u305F\u30B9\u30AD\u30EB\u306E\u30EB\u30FC\u30EB\u306B\u5F93\u3063\u3066\u81EA\u5F8B\u7684\u306B\u5224\u65AD\u3057\u3001\u5168\u30B9\u30C6\u30C3\u30D7\u3092\u5B8C\u9042\u3057\u3066\u304B\u3089\uFF08\u307E\u305F\u306F\u4E2D\u65AD\u6761\u4EF6\u306B\u8A72\u5F53\u3057\u305F\u5834\u5408\u306F\u7406\u7531\u3092\u51FA\u529B\u3057\u3066\uFF09\u7D42\u4E86\u3059\u308B\u3053\u3068\u3002\u66D6\u6627\u306A\u5834\u5408\u306F\u300C\u3088\u308A\u5B89\u5168\u306A\u5074\uFF08\u7834\u58CA\u7684\u3067\u306A\u3044\u5074\uFF09\u300D\u3092\u9078\u629E\u3057\u3001\u305D\u306E\u5224\u65AD\u3068\u6839\u62E0\u3092\u6700\u7D42\u5831\u544A\u306B\u660E\u8A18\u3059\u308B\u3002`;
774
+ var SUBAGENT_SYSTEM_PROMPT = `\u3042\u306A\u305F\u306F claude-task-worker \u306E\u30EF\u30FC\u30AB\u30FC\u304C \`claude -p\`\uFF08\u975E\u5BFE\u8A71 print \u30E2\u30FC\u30C9\uFF09\u3067\u81EA\u52D5\u8D77\u52D5\u3057\u305F\u30BB\u30C3\u30B7\u30E7\u30F3\u5185\u306E\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u3067\u3059\u3002\u4EE5\u4E0B\u306E\u81EA\u5F8B\u5B9F\u884C\u539F\u5247\u3092\u5FC5\u305A\u9075\u5B88\u3057\u3066\u304F\u3060\u3055\u3044\u3002
775
+
776
+ - \u30E6\u30FC\u30B6\u30FC\u3078\u306E\u78BA\u8A8D\u30FB\u8CEA\u554F\u306F\u884C\u308F\u306A\u3044\uFF08\u56DE\u7B54\u3059\u308B\u30E6\u30FC\u30B6\u30FC\u306F\u5B58\u5728\u3057\u306A\u3044\uFF09\u3002\u5224\u65AD\u306F\u3059\u3079\u3066\u59D4\u8B72\u3055\u308C\u305F\u6307\u793A\uFF08\u30D7\u30ED\u30F3\u30D7\u30C8\u3067\u660E\u793A\u7684\u306B\u6E21\u3055\u308C\u305F\u5185\u5BB9\uFF09\u306B\u5F93\u3063\u3066\u81EA\u52D5\u3067\u6C7A\u5B9A\u3059\u308B
777
+ - \u66D6\u6627\u306A\u5834\u5408\u306F\u300C\u3088\u308A\u5B89\u5168\u306A\u5074\uFF08\u7834\u58CA\u7684\u3067\u306A\u3044\u5074\uFF09\u300D\u3092\u9078\u629E\u3057\u3001\u305D\u306E\u5224\u65AD\u3068\u6839\u62E0\u3092\u6700\u7D42\u5831\u544A\u306B\u660E\u8A18\u3059\u308B
778
+ - \u59D4\u8B72\u3055\u308C\u305F\u30BF\u30B9\u30AF\u306F\u6700\u5F8C\u307E\u3067\u5B8C\u9042\u3057\u3066\u304B\u3089\u6700\u7D42\u5831\u544A\u3059\u308B\u3002\u6307\u793A\u306B\u5B9A\u7FA9\u3055\u308C\u305F\u4E2D\u65AD\u6761\u4EF6\u306B\u8A72\u5F53\u3057\u305F\u5834\u5408\u306E\u307F\u3001\u7406\u7531\u3092\u51FA\u529B\u3057\u3066\u7D42\u4E86\u3059\u308B
779
+ - \u5B50\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306B\u4F5C\u696D\u3092\u59D4\u8B72\u3057\u305F\u5834\u5408\u3001\u305D\u306E\u5B8C\u4E86\u5831\u544A\u3092\u9D5C\u5451\u307F\u306B\u3057\u306A\u3044\u3002\`git diff\` \u7B49\u3067\u5B9F\u969B\u306E\u6210\u679C\u7269\u3092\u691C\u8A3C\u3057\u3066\u304B\u3089\u5B8C\u4E86\u6271\u3044\u306B\u3059\u308B`;
772
780
 
773
781
  // src/config.ts
774
782
  import { readFileSync } from "node:fs";
@@ -1154,7 +1162,7 @@ function ensureRenderInterval() {
1154
1162
  renderInterval = setInterval(renderTable, 1e3);
1155
1163
  renderInterval.unref();
1156
1164
  }
1157
- function run(command, args, id, title, workerName, path, onComplete, cwd) {
1165
+ function run(command, args, id, title, workerName, path, onComplete, cwd, env) {
1158
1166
  tasks.set(id, {
1159
1167
  id,
1160
1168
  title,
@@ -1168,7 +1176,8 @@ function run(command, args, id, title, workerName, path, onComplete, cwd) {
1168
1176
  const child = spawn(command, args, {
1169
1177
  stdio: ["ignore", "pipe", "pipe"],
1170
1178
  detached: true,
1171
- ...cwd ? { cwd } : {}
1179
+ ...cwd ? { cwd } : {},
1180
+ ...env ? { env: { ...process.env, ...env } } : {}
1172
1181
  });
1173
1182
  childProcesses.set(id, child);
1174
1183
  const outputChunks = [];
@@ -1862,8 +1871,13 @@ function createIssuePollingWorker(config) {
1862
1871
  "-p",
1863
1872
  `${command} ${issue.number}`,
1864
1873
  "--dangerously-skip-permissions",
1874
+ "--chrome",
1865
1875
  "--disallowedTools",
1866
1876
  DISALLOWED_TOOLS_ARG,
1877
+ "--append-system-prompt",
1878
+ SYSTEM_PROMPT,
1879
+ "--append-subagent-system-prompt",
1880
+ SUBAGENT_SYSTEM_PROMPT,
1867
1881
  "--model",
1868
1882
  model,
1869
1883
  "--effort",
@@ -1923,7 +1937,8 @@ function createIssuePollingWorker(config) {
1923
1937
  );
1924
1938
  }
1925
1939
  },
1926
- cwd
1940
+ cwd,
1941
+ { ...CLAUDE_SPAWN_ENV }
1927
1942
  );
1928
1943
  } catch (err) {
1929
1944
  console.error(`[${config.name}] setup error for #${issue.number}: ${err}`);
@@ -1973,7 +1988,7 @@ var execIssueWorker = (opts = {}) => createIssuePollingWorker({
1973
1988
  console.log(`[exec-issue] #${issueNumber}: issue closed by skill (no-change path), skip cc-pr-created`);
1974
1989
  return;
1975
1990
  }
1976
- const prNumber = await findPrNumberByHeadRef(worktreeId, "all") ?? await findPrNumberClosingIssue(issueNumber);
1991
+ const prNumber = await findPrNumberByHeadRef(worktreeId, "all") ?? await findPrNumberClosingIssue(issueNumber, worktreeId);
1977
1992
  if (prNumber !== null) {
1978
1993
  await addLabel("issue", issueNumber, "cc-pr-created");
1979
1994
  return;
@@ -2038,8 +2053,13 @@ function createPrPollingWorker(config) {
2038
2053
  "-p",
2039
2054
  `${command} ${pr.number}`,
2040
2055
  "--dangerously-skip-permissions",
2056
+ "--chrome",
2041
2057
  "--disallowedTools",
2042
2058
  DISALLOWED_TOOLS_ARG,
2059
+ "--append-system-prompt",
2060
+ SYSTEM_PROMPT,
2061
+ "--append-subagent-system-prompt",
2062
+ SUBAGENT_SYSTEM_PROMPT,
2043
2063
  "--model",
2044
2064
  model,
2045
2065
  "--effort",
@@ -2086,7 +2106,8 @@ function createPrPollingWorker(config) {
2086
2106
  );
2087
2107
  }
2088
2108
  },
2089
- cwd
2109
+ cwd,
2110
+ { ...CLAUDE_SPAWN_ENV }
2090
2111
  );
2091
2112
  } catch (err) {
2092
2113
  console.error(`[${config.name}] setup error for PR #${pr.number}: ${err}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-task-worker",
3
- "version": "0.20.0",
3
+ "version": "0.22.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",