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.
- package/README.md +10 -6
- package/dist/index.js +42 -8
- 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-
|
|
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
|
|
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`
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|