claude-task-worker 0.46.0 → 0.48.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 +10 -6
  2. package/dist/index.js +42 -8
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -74,7 +74,8 @@ UI実装Issueについて、実装の前に Pencil(`.pen`)でデザインを
74
74
  {
75
75
  "uiDesign": {
76
76
  "enabled": true,
77
- "designDir": "designs"
77
+ "designDir": "designs",
78
+ "yolo": false
78
79
  }
79
80
  }
80
81
  ```
@@ -83,6 +84,7 @@ UI実装Issueについて、実装の前に Pencil(`.pen`)でデザインを
83
84
  |---|---|---|
84
85
  | `uiDesign.enabled` | `false` | 本ワークフローの有効化。`false` の間は `triage-created-issue` がUI判定を行わず、2つのワーカーも起動しない |
85
86
  | `uiDesign.designDir` | `"designs"` | `.pen` とスナップショットの配置先(リポジトリルートからの相対パス) |
87
+ | `uiDesign.yolo` | `false` | デザインPRを自動レビュー・自動マージへ流すか。`true` のときだけデザインPRに `cc-triage-scope` を付与する。`false`(既定)ではデザインPRは `cc-ui-design` のみが付いた状態で止まり、人がレビュー・マージするまで `apply-ui-design` は先へ進まない |
86
88
 
87
89
  フローは以下のとおり。
88
90
 
@@ -93,8 +95,9 @@ cc-issue-created + triage-created-issue(ルーティング)
93
95
  → create-ui-design ワーカー
94
96
  ・.pen を作成/更新 + snapshots/ に PNG 出力
95
97
  ・ブランチ cc-ui-design-<N> を push しデザインPRを作成(Refs #N。closing keyword は使わない)
96
- ・PR に cc-triage-scope + cc-ui-design、Issue に cc-ui-design-pr-created を付与
97
- → triage-pr / fix-review-point / resolve-conflict(既存フローでレビュー・マージ)
98
+ ・PR に cc-ui-design(uiDesign.yolo true なら cc-triage-scope も)、Issue に cc-ui-design-pr-created を付与
99
+ uiDesign.yolo: true → triage-pr / fix-review-point / resolve-conflict(既存フローでレビュー・マージ)
100
+ uiDesign.yolo: false → 人がデザインPRをレビュー・マージ
98
101
  → apply-ui-design ワーカー
99
102
  ・デザインPRが MERGED になるまで skip
100
103
  ・Issue description に「## UIデザイン」セクションを追記
@@ -102,7 +105,7 @@ cc-issue-created + triage-created-issue(ルーティング)
102
105
  → exec-issue(デザインを参照元として実装)
103
106
  ```
104
107
 
105
- デザインPR Epic PR ではないため `cc-release-ready` によるマージ保留の対象外で、`triage-pr` が通常どおりレビュー・マージする。`triage-pr` は `cc-ui-design` ラベル付きPRに対してコードレビューではなくデザイン向けの観点(差分が `.pen` とPNGに限定されているか、スナップショットとデザイン意図が読み取れるか、Issue要件を満たしているか)で評価する。
108
+ デザインPRのレビュー・マージ経路は `uiDesign.yolo` で切り替わる。`true` のときはデザインPRに `cc-triage-scope` が付き、Epic PR ではないため `cc-release-ready` によるマージ保留の対象外で、`triage-pr` が通常どおりレビュー・マージする。`false`(既定)では `cc-triage-scope` を付けないためどのワーカーもデザインPRを拾わず、人がレビューしてマージするまで待つ(`apply-ui-design` はデザインPRが `MERGED` になるまでスキップし続ける)。デザインに人が介在したい場合は既定のままにする。`triage-pr` は `cc-ui-design` ラベル付きPRに対してコードレビューではなくデザイン向けの観点(差分が `.pen` とPNGに限定されているか、スナップショットとデザイン意図が読み取れるか、Issue要件を満たしているか)で評価する。
106
109
 
107
110
  デザインが不要と判明した場合は `create-ui-design` が理由をコメントして `cc-ui-design-ready` + `cc-exec-issue` を付与し、人手を介さず実装へ復帰する。Pencil が使えない環境やデザインPRが却下された場合は `cc-need-human-check` に落ちて停止する(共通除外ラベルのため無限リトライしない)。
108
111
 
@@ -465,6 +468,7 @@ advisor は main モデル以上の能力を持つモデルである必要があ
465
468
  `cc-issue-created` と `cc-triage-scope` の両方のラベルが付いたIssueを定期取得し、Claude Codeでトリアージを実行する。(1分間隔)
466
469
 
467
470
  - `cc-pr-created` / `cc-update-issue` / `cc-answer-issue-questions` / `cc-exec-issue` のいずれかが付いているIssueは除外
471
+ - `cc-create-ui-design` / `cc-ui-design-pr-created`(UIデザイン先行フローの進行中マーカー)が付いているIssueも除外。トリガーラベルはトリアージ完了後に付き直されるため、除外しないとデザインPRのマージまで再トリアージが走り続け、パターンE-1の前提ゲートが満たされない再実行が `cc-exec-issue` を付けてデザイン合意前に実装を始めてしまう
468
472
  - 確認事項の有無に応じて `cc-answer-issue-questions` または `cc-exec-issue` ラベルを付与(または不要ならクローズ)
469
473
 
470
474
  ### triage-pr
@@ -505,7 +509,7 @@ advisor は main モデル以上の能力を持つモデルである必要があ
505
509
  - `claude-task-worker.json` の `uiDesign.enabled` が `true` の場合のみ起動する(`false` なら1行ログを出して即終了)
506
510
  - `cc-ui-design-pr-created` / `cc-ui-design-ready` が付いているIssueは除外
507
511
  - デザインPRは `cc-ui-design-<Issue番号>` の固定名ブランチを head とする(後段の `apply-ui-design` が一意に特定するため)
508
- - 完了後、デザインPRの実在を確認できた場合のみ、PRに `cc-ui-design` `cc-triage-scope`、Issueに `cc-ui-design-pr-created` を付与する
512
+ - 完了後、デザインPRの実在を確認できた場合のみ、PRに `cc-ui-design`(`uiDesign.yolo` `true` の場合は `cc-triage-scope` も)、Issueに `cc-ui-design-pr-created` を付与する
509
513
  - スキルが「デザイン不要」と判定した場合(`cc-ui-design-ready` 付与済み)は完了扱いとし、そのまま実装フェーズへ流す
510
514
  - PRの実在を確認できない場合は `cc-need-human-check` を付与してIssueにコメントを残す
511
515
 
@@ -580,7 +584,7 @@ claude-task-worker -v
580
584
  | キー | 型 | デフォルト | 説明 |
581
585
  |---|---|---|---|
582
586
  | `fixReviewPointCallbackCommentMessage` | string | - | fix-review-point 完了時にPRへ投稿するコメント(未設定の場合は投稿しない) |
583
- | `uiDesign` | object | `{ "enabled": false, "designDir": "designs" }` | UIデザイン先行ワークフローの設定(詳細は「[UIデザイン先行ワークフロー](#uiデザイン先行ワークフロー)」) |
587
+ | `uiDesign` | object | `{ "enabled": false, "designDir": "designs", "yolo": false }` | UIデザイン先行ワークフローの設定(詳細は「[UIデザイン先行ワークフロー](#uiデザイン先行ワークフロー)」) |
584
588
  | `workers` | object | `{}` | ワーカーごとに Claude CLI に渡すスキル、`--model` / `--advisor` / `--effort`、ポーリング間隔、クールダウン時間、最大同時実行数を上書きする設定(詳細は下記) |
585
589
 
586
590
  ### ワーカーごとの設定
package/dist/index.js CHANGED
@@ -1597,7 +1597,8 @@ import { readFileSync } from "node:fs";
1597
1597
  import { isAbsolute, join, normalize, sep as SEP } from "node:path";
1598
1598
  var DEFAULT_UI_DESIGN_CONFIG = {
1599
1599
  enabled: false,
1600
- designDir: "designs"
1600
+ designDir: "designs",
1601
+ yolo: false
1601
1602
  };
1602
1603
  var DEFAULT_WORKER_CONFIG = {
1603
1604
  skill: "",
@@ -1813,6 +1814,15 @@ function parseUiDesignEntry(val) {
1813
1814
  );
1814
1815
  }
1815
1816
  }
1817
+ if ("yolo" in entry) {
1818
+ if (typeof entry.yolo === "boolean") {
1819
+ result.yolo = entry.yolo;
1820
+ } else {
1821
+ console.warn(
1822
+ `[config] invalid uiDesign.yolo: ${String(entry.yolo)}, using default ${DEFAULT_UI_DESIGN_CONFIG.yolo}`
1823
+ );
1824
+ }
1825
+ }
1816
1826
  if ("designDir" in entry) {
1817
1827
  const normalized = typeof entry.designDir === "string" && entry.designDir.length > 0 ? normalize(entry.designDir) : null;
1818
1828
  const isContained = normalized !== null && !isAbsolute(normalized) && normalized !== ".." && !normalized.startsWith(`..${SEP}`);
@@ -3369,7 +3379,22 @@ var triageCreatedIssueWorker = (opts = {}) => createIssuePollingWorker({
3369
3379
  name: "triage-created-issue",
3370
3380
  command: "/claude-task-worker:triage-created-issue",
3371
3381
  triggerLabels: ["cc-issue-created", "cc-triage-scope"],
3372
- excludeLabels: ["cc-pr-created", "cc-update-issue", "cc-answer-issue-questions", "cc-exec-issue"],
3382
+ // cc-create-ui-design / cc-ui-design-pr-created はUIデザイン先行フローの進行中マーカー。
3383
+ // 除外しないと、トリガーラベル(cc-issue-created / cc-triage-scope)はトリアージ完了後も
3384
+ // 付き直されるため、デザインPRの作成〜レビュー〜マージが終わるまでの間ずっと再トリアージが
3385
+ // 走り続ける。しかもスキルのパターンE-1は「cc-create-ui-design / cc-ui-design-pr-created が
3386
+ // 付いていない」ことを前提ゲートにしているため、再実行では E-1 がスキップされてパターンE
3387
+ // (cc-exec-issue 付与)へ落ち、デザイン合意前に実装フェーズが始まってしまう。
3388
+ // cc-ui-design-ready はデザイン確定後のマーカーで、同時に付く cc-exec-issue 側で除外されるため
3389
+ // ここには含めない(実装完了後の再トリアージ可能性を残す)。
3390
+ excludeLabels: [
3391
+ "cc-pr-created",
3392
+ "cc-update-issue",
3393
+ "cc-answer-issue-questions",
3394
+ "cc-exec-issue",
3395
+ "cc-create-ui-design",
3396
+ "cc-ui-design-pr-created"
3397
+ ],
3373
3398
  epicFilters: opts.epicFilters,
3374
3399
  labelFilters: opts.labelFilters,
3375
3400
  onCompleted: async (issueNumber) => {
@@ -3518,11 +3543,12 @@ function designReferenceMissingComment(issueNumber) {
3518
3543
  }
3519
3544
 
3520
3545
  // src/workers/create-ui-design.ts
3521
- function designPrLabelingFailedComment(issueNumber, prNumber, error) {
3546
+ function designPrLabelingFailedComment(issueNumber, prNumber, error, yolo = false) {
3522
3547
  const message = error instanceof Error ? error.message : String(error);
3548
+ const prLabels = yolo ? "`cc-ui-design` / `cc-triage-scope`" : "`cc-ui-design`";
3523
3549
  return [
3524
3550
  "## \u30C7\u30B6\u30A4\u30F3PR\u3078\u306E\u30E9\u30D9\u30EB\u4ED8\u4E0E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u8981\u4EBA\u624B\u78BA\u8A8D\uFF09",
3525
- `\u30C7\u30B6\u30A4\u30F3PR #${prNumber}\uFF08\u30D6\u30E9\u30F3\u30C1 \`${designBranchName(issueNumber)}\`\uFF09\u306F\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F\u304C\u3001\u5F8C\u7D9A\u30E9\u30D9\u30EB\uFF08\`cc-ui-design\` / \`cc-triage-scope\` / \`cc-ui-design-pr-created\`\uFF09\u306E\u4ED8\u4E0E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002`,
3551
+ `\u30C7\u30B6\u30A4\u30F3PR #${prNumber}\uFF08\u30D6\u30E9\u30F3\u30C1 \`${designBranchName(issueNumber)}\`\uFF09\u306F\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F\u304C\u3001\u5F8C\u7D9A\u30E9\u30D9\u30EB\uFF08${prLabels} / \`cc-ui-design-pr-created\`\uFF09\u306E\u4ED8\u4E0E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002`,
3526
3552
  "",
3527
3553
  "## \u8D77\u3053\u308A\u3046\u308B\u539F\u56E0",
3528
3554
  "- \u672C\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u8FFD\u52A0\u6642\u306E\u30E9\u30D9\u30EB\u304C\u672A\u4F5C\u6210\u306E\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002`claude-task-worker init` \u3092\u518D\u5B9F\u884C\u3057\u3066\u30E9\u30D9\u30EB\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044",
@@ -3533,14 +3559,16 @@ function designPrLabelingFailedComment(issueNumber, prNumber, error) {
3533
3559
  "```",
3534
3560
  "",
3535
3561
  "## \u5BFE\u5FDC\u5F8C\u306E\u9032\u3081\u65B9",
3536
- "- \u30E9\u30D9\u30EB\u4F5C\u6210\u5F8C\u306B\u3084\u308A\u76F4\u3059\u5834\u5408: `cc-need-human-check` \u30E9\u30D9\u30EB\u3092\u5916\u3057\u3001`cc-ui-design`\u30FB`cc-triage-scope`\uFF08PR\u5074\uFF09\u3068 `cc-ui-design-pr-created`\uFF08Issue\u5074\uFF09\u3092\u624B\u52D5\u3067\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044"
3562
+ `- \u30E9\u30D9\u30EB\u4F5C\u6210\u5F8C\u306B\u3084\u308A\u76F4\u3059\u5834\u5408: \`cc-need-human-check\` \u30E9\u30D9\u30EB\u3092\u5916\u3057\u3001${yolo ? "`cc-ui-design`\u30FB`cc-triage-scope`" : "`cc-ui-design`"}\uFF08PR\u5074\uFF09\u3068 \`cc-ui-design-pr-created\`\uFF08Issue\u5074\uFF09\u3092\u624B\u52D5\u3067\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044`
3537
3563
  ].join("\n");
3538
3564
  }
3539
3565
  var createUiDesignWorker = async (opts = {}) => {
3540
- if (!getUiDesignConfig().enabled) {
3566
+ const uiDesignConfig = getUiDesignConfig();
3567
+ if (!uiDesignConfig.enabled) {
3541
3568
  console.log("[create-ui-design] uiDesign.enabled is false, skipping");
3542
3569
  return;
3543
3570
  }
3571
+ const yolo = uiDesignConfig.yolo;
3544
3572
  await createIssuePollingWorker({
3545
3573
  name: "create-ui-design",
3546
3574
  command: "/claude-task-worker:create-ui-design",
@@ -3571,12 +3599,18 @@ var createUiDesignWorker = async (opts = {}) => {
3571
3599
  }
3572
3600
  try {
3573
3601
  await addLabel("pr", prNumber, "cc-ui-design");
3574
- await addLabel("pr", prNumber, "cc-triage-scope");
3602
+ if (yolo) {
3603
+ await addLabel("pr", prNumber, "cc-triage-scope");
3604
+ } else {
3605
+ console.log(
3606
+ `[create-ui-design] #${issueNumber}: uiDesign.yolo is false, leaving design PR #${prNumber} for human review (no cc-triage-scope)`
3607
+ );
3608
+ }
3575
3609
  await addLabel("issue", issueNumber, "cc-ui-design-pr-created");
3576
3610
  } catch (err) {
3577
3611
  console.error(`[create-ui-design] #${issueNumber}: labeling design PR #${prNumber} failed: ${err}`);
3578
3612
  await addLabel("issue", issueNumber, "cc-need-human-check");
3579
- await commentOnIssue(issueNumber, designPrLabelingFailedComment(issueNumber, prNumber, err)).catch(
3613
+ await commentOnIssue(issueNumber, designPrLabelingFailedComment(issueNumber, prNumber, err, yolo)).catch(
3580
3614
  (commentErr) => console.error(`[create-ui-design] commentOnIssue failed for #${issueNumber}: ${commentErr}`)
3581
3615
  );
3582
3616
  return false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-task-worker",
3
- "version": "0.46.0",
3
+ "version": "0.48.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",