claude-task-worker 0.96.0 → 0.98.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 +3 -1
  2. package/dist/index.js +22 -14
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -247,7 +247,9 @@ claude-task-worker exec-issue --project app-a --epic 100 --label priority-high
247
247
 
248
248
  ### `--cloud`
249
249
 
250
- 指定したワーカーのタスクを Claude Code on the web(クラウド VM)で実行する。プロセス単位のフラグで既定は無効。`all` / `yolo` に付けると、クラウド実行を拒否するワーカー(`CLOUD_DENIED_WORKERS`: `resolve-conflict` / `create-ui-design` / `apply-ui-design` + 定期ワーカー3つ `update-coding-guidelines` / `update-requirement-rules` / `update-design-md`)だけがローカル実行のまま残り、それ以外は全てクラウド実行になる。どのワーカーがローカルに残るかは起動時に1行ログで示される。
250
+ 指定したワーカーのタスクを Claude Code on the web(クラウド VM)で実行する。プロセス単位のフラグで既定は無効。クラウドで実行されるのは `exec-issue` / `fix-review-point` の2つだけで(`CLOUD_ALLOWED_WORKERS`)、それ以外のワーカーは `--cloud` を付けてもローカル実行のまま残る。どのワーカーがクラウドで走るかは起動時に1行ログで示される。
251
+
252
+ 許可リスト方式にしているのは、クラウド実行が「成果ゼロでも完了扱いになり、トリガーラベルの再付与で再起動され続ける」失敗の仕方をするため。`triage-pr` などは GraphQL ゲートで判断材料を取得できず空振りするが、完了扱いになるとポーリング間隔ごとにクラウドセッションを焼き続ける。
251
253
 
252
254
  ```bash
253
255
  claude-task-worker exec-issue --cloud
package/dist/index.js CHANGED
@@ -1853,14 +1853,9 @@ var SCHEDULED_WORKER_NAMES = [
1853
1853
  "update-design-md"
1854
1854
  ];
1855
1855
  var CLOUD_DONE_LABEL = "cc-cloud-done";
1856
- var CLOUD_DENIED_WORKERS = [
1857
- "resolve-conflict",
1858
- "create-ui-design",
1859
- "apply-ui-design",
1860
- ...SCHEDULED_WORKER_NAMES
1861
- ];
1856
+ var CLOUD_ALLOWED_WORKERS = ["exec-issue", "fix-review-point"];
1862
1857
  function isCloudWorker(name) {
1863
- return hasCloudFlag() && !CLOUD_DENIED_WORKERS.includes(name);
1858
+ return hasCloudFlag() && CLOUD_ALLOWED_WORKERS.includes(name);
1864
1859
  }
1865
1860
  function checkCloudAuth(input) {
1866
1861
  if (input.status.kind === "unknown") return [];
@@ -2488,13 +2483,24 @@ function buildCloudCreateArgs(commonArgs, prompt) {
2488
2483
  }
2489
2484
  function appendCloudDoneInstruction(prompt, target) {
2490
2485
  const targetLabel = target.type === "issue" ? `Issue #${target.number}` : `PR #${target.number}`;
2486
+ const checkoutInstruction = buildCloudCheckoutInstruction(target);
2487
+ const worktreeInstruction = buildCloudWorktreeInstruction(prompt);
2491
2488
  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`;
2492
2489
  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`;
2493
- return `${prompt}
2494
-
2495
- ${reportInstruction}
2496
-
2497
- ${labelInstruction}`;
2490
+ return [prompt, checkoutInstruction, worktreeInstruction, reportInstruction, labelInstruction].filter((part) => part !== "").join("\n\n");
2491
+ }
2492
+ var CLOUD_WORKTREE_EXEMPT_SKILLS = ["exec-issue", "fix-review-point"];
2493
+ function buildCloudWorktreeInstruction(prompt) {
2494
+ const skill = prompt.trim().split(/\s+/)[0] ?? "";
2495
+ if (!CLOUD_WORKTREE_EXEMPT_SKILLS.some((name) => skill.endsWith(`:${name}`))) return "";
2496
+ return "\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u30AF\u30E9\u30A6\u30C9\u5B9F\u884C\u306E\u305F\u3081 worktree \u3092\u6301\u305F\u305A\u3001cwd \u306F\u30EA\u30DD\u30B8\u30C8\u30EA\u30EB\u30FC\u30C8\u3067\u3042\u308B\uFF08\u30EF\u30FC\u30AB\u30FC\u306F\u30AF\u30E9\u30A6\u30C9\u5B9F\u884C\u6642\u306B worktree \u3092\u4F5C\u3089\u306A\u3044\uFF09\u3002\u30B9\u30AD\u30EB\u672C\u6587\u306E\u30D5\u30A7\u30FC\u30BA0\u306B\u3042\u308B\u300C`pwd` \u304C `.claude/worktrees/` \u914D\u4E0B\u3067\u306A\u3051\u308C\u3070\u4E2D\u65AD\u3059\u308B\u300D\u78BA\u8A8D\u306F\u3001\u3053\u306E\u6307\u793A\u304C\u3042\u308B\u5834\u5408\u306B\u9650\u308A\u9069\u7528\u3057\u306A\u3044\u3053\u3068\u3002\u305F\u3060\u3057\u30AC\u30FC\u30C9\u306E\u76EE\u7684\u3067\u3042\u308B\u300C\u30C7\u30D5\u30A9\u30EB\u30C8\u30D6\u30E9\u30F3\u30C1\u3067\u4F5C\u696D\u3057\u306A\u3044\u300D\u306F\u7DAD\u6301\u3059\u308B\u3053\u3068 \u2014 \u540C\u3058\u30D5\u30A7\u30FC\u30BA0\u306E\u300C\u30C7\u30D5\u30A9\u30EB\u30C8\u30D6\u30E9\u30F3\u30C1\u540D\u3092\u53D6\u5F97\u3057\u3001\u73FE\u5728\u30D6\u30E9\u30F3\u30C1\u3068\u4E00\u81F4\u3059\u308B\u5834\u5408\u306F\u4E2D\u65AD\u3059\u308B\uFF08\u53D6\u5F97\u5931\u6557\u3082\u4E2D\u65AD\uFF09\u300D\u306F\u5FC5\u305A\u5B9F\u884C\u3057\u3001\u4E00\u81F4\u3057\u305F\u5834\u5408\u306F\u5F93\u6765\u3069\u304A\u308A\u4E2D\u65AD\u3059\u308B\u3053\u3068\u3002";
2497
+ }
2498
+ function buildCloudCheckoutInstruction(target) {
2499
+ if (target.type !== "pr") return "";
2500
+ return `\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F PR #${target.number} \u306E head \u30D6\u30E9\u30F3\u30C1\u4E0A\u3067\u958B\u59CB\u3057\u3066\u3044\u308B\uFF08\u30EF\u30FC\u30AB\u30FC\u304C \`--on-branch\` \u3067\u6307\u5B9A\u6E08\u307F\uFF09\u3002\u30B9\u30AD\u30EB\u672C\u6587\u304C\u6307\u793A\u3059\u308B \`gh pr checkout\` \u306F\u5B9F\u884C\u3057\u306A\u3044\u3053\u3068\uFF08\u30AF\u30E9\u30A6\u30C9\u3067\u306F GraphQL \u30B2\u30FC\u30C8\u306B\u3088\u308A 403 \u3067\u5931\u6557\u3057\u3001\u304B\u3064\u65E2\u306B\u30D6\u30E9\u30F3\u30C1\u4E0A\u306B\u3044\u308B\u306E\u3067\u4E0D\u8981\uFF09\u3002\u30D6\u30E9\u30F3\u30C1\u306E\u78BA\u8A8D\u304C\u8981\u308B\u5834\u5408\u306F \`git rev-parse --abbrev-ref HEAD\` \u3092\u4F7F\u3046\u3053\u3068\u3002`;
2501
+ }
2502
+ function buildCloudGitHubAccessInstruction() {
2503
+ return "\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u30AF\u30E9\u30A6\u30C9\u5B9F\u884C\u306E\u305F\u3081\u3001GitHub \u306E\u53C2\u7167/\u66F4\u65B0\u306F **GitHub MCP \u3092\u7B2C\u4E00\u624B\u6BB5**\u306B\u3059\u308B\u3053\u3068\uFF08\u30B9\u30AD\u30EB\u672C\u6587\u3068 `references/github-access.md` \u306E\u65E2\u5B9A\u3067\u3042\u308B `gh` \u512A\u5148\u3092\u3001\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306B\u9650\u308A\u9006\u8EE2\u3055\u305B\u308B\uFF09\u3002\u30AF\u30E9\u30A6\u30C9\u306E GitHub \u30D7\u30ED\u30AD\u30B7\u306F `gh issue view --json` / `gh pr view --json` \u306A\u3069\u306E GraphQL \u7D4C\u7531\u306E\u64CD\u4F5C\u3092\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u554F\u308F\u305A 403 \u306B\u3059\u308B\u305F\u3081\u3001`gh` \u3092\u7B2C\u4E00\u624B\u6BB5\u306B\u3059\u308B\u3068 Issue/PR \u672C\u6587\u3092\u53D6\u5F97\u3067\u304D\u306A\u3044\u3002MCP \u306B\u8A72\u5F53\u30C4\u30FC\u30EB\u304C\u7121\u3044\u64CD\u4F5C\u306F `gh api repos/...`\uFF08REST\uFF09\u307E\u305F\u306F `plugin/scripts/gh-compat.sh` \u3092\u4F7F\u3046\u3053\u3068\uFF08REST \u306F\u30AF\u30E9\u30A6\u30C9\u3067\u3082\u6210\u529F\u3059\u308B\uFF09\u3002\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u306F1\u64CD\u4F5C\u306B\u3064\u304D1\u56DE\u307E\u3067\u3002";
2498
2504
  }
2499
2505
  function buildCloudToolRestriction() {
2500
2506
  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(", ")}`;
@@ -2504,7 +2510,9 @@ function buildCloudPrompt(prompt, model, target) {
2504
2510
 
2505
2511
  ${systemPromptFor(model)}
2506
2512
 
2507
- ${buildCloudToolRestriction()}`;
2513
+ ${buildCloudToolRestriction()}
2514
+
2515
+ ${buildCloudGitHubAccessInstruction()}`;
2508
2516
  const withPrinciples = `${prompt}
2509
2517
 
2510
2518
  ${principles}`;
@@ -5358,7 +5366,7 @@ async function assertCloudAvailable() {
5358
5366
  }
5359
5367
  if (cloud) {
5360
5368
  console.log(
5361
- `[worker] cloud execution enabled (--cloud); these workers stay local: ${CLOUD_DENIED_WORKERS.join(", ")}`
5369
+ `[worker] cloud execution enabled (--cloud); only these workers run in the cloud: ${CLOUD_ALLOWED_WORKERS.join(", ")} (all others stay local)`
5362
5370
  );
5363
5371
  }
5364
5372
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-task-worker",
3
- "version": "0.96.0",
3
+ "version": "0.98.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",